[d-kernel] PATCH: 2.6 fixes for fix-drivers-block and fix-build

Konstantin A. Lepikhov lakostis на anti-leasure.ru
Сб Окт 23 13:36:51 MSD 2004


Hi!

Найдено в -ck1 updates. Есть ли смысл их добавить?

-- 
WBR, Konstantin	      chat with ==>ICQ: 109916175
     Lepikhov,	      speak  to ==>JID: lakostis на jabber.org
aka L.A. Kostis       write  to ==>mailto:lakostis на pisem.net.nospam

...The information is like the bank... 			  (c) EC8OR
----------- следущая часть -----------
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/10/18 22:43:26-07:00 torvalds на ppc970.osdl.org 
#   Wrap <linux/compiler.h> inside '#ifndef __ASSEMBLY__'
#   
#   None of the compatibility defines make sense for assembly
#   files, and gcc has trouble with vararg macros when using
#   "-traditional" (which is used for asm), to the point of
#   ICE'ing.
# 
# include/linux/compiler.h
#   2004/10/18 22:43:20-07:00 torvalds на ppc970.osdl.org +4 -2
#   Wrap <linux/compiler.h> inside '#ifndef __ASSEMBLY__'
#   
#   None of the compatibility defines make sense for assembly
#   files, and gcc has trouble with vararg macros when using
#   "-traditional" (which is used for asm), to the point of
#   ICE'ing.
# 
Index: linux-2.6.9-ck1/include/linux/compiler.h
===================================================================
--- linux-2.6.9-ck1.orig/include/linux/compiler.h	2004-10-19 08:57:12.000000000 +1000
+++ linux-2.6.9-ck1/include/linux/compiler.h	2004-10-19 20:05:41.255008517 +1000
@@ -1,6 +1,8 @@
 #ifndef __LINUX_COMPILER_H
 #define __LINUX_COMPILER_H
 
+#ifndef __ASSEMBLY__
+
 #ifdef __CHECKER__
 # define __user		__attribute__((noderef, address_space(1)))
 # define __kernel	/* default address space */
@@ -21,7 +23,6 @@ extern void __chk_io_ptr(void __iomem *)
 
 #ifdef __KERNEL__
 
-#ifndef __ASSEMBLY__
 #if __GNUC__ > 3
 # include <linux/compiler-gcc+.h>	/* catch-all for GCC 4, 5, etc. */
 #elif __GNUC__ == 3
@@ -31,7 +32,6 @@ extern void __chk_io_ptr(void __iomem *)
 #else
 # error Sorry, your compiler is too old/not recognized.
 #endif
-#endif
 
 /* Intel compiler defines __GNUC__. So we will overwrite implementations
  * coming from above header files here
@@ -61,6 +61,8 @@ extern void __chk_io_ptr(void __iomem *)
     (typeof(ptr)) (__ptr + (off)); })
 #endif
 
+#endif /* __ASSEMBLY__ */
+
 #endif /* __KERNEL__ */
 
 /*
----------- следущая часть -----------

From: Jens Axboe <axboe на suse.de>

blk_recalc_rq_segments forgots to take ->max_segment_size into account and
gladly merges segments bigger than we can support, thus underestimating the
number of segments needed to fill it.

Signed-off-by: Jens Axboe <axboe на suse.de>
Signed-off-by: Andrew Morton <akpm на osdl.org>
Index: linux-2.6.9-ck2/drivers/block/ll_rw_blk.c
===================================================================
--- linux-2.6.9-ck2.orig/drivers/block/ll_rw_blk.c	2004-10-22 10:34:33.000000000 +1000
+++ linux-2.6.9-ck2/drivers/block/ll_rw_blk.c	2004-10-22 21:46:27.286378575 +1000
@@ -2740,22 +2740,36 @@ void blk_recalc_rq_segments(struct reque
 {
 	struct bio *bio, *prevbio = NULL;
 	int nr_phys_segs, nr_hw_segs;
+	unsigned int phys_size, hw_size;
+	request_queue_t *q = rq->q;
 
 	if (!rq->bio)
 		return;
 
-	nr_phys_segs = nr_hw_segs = 0;
+	phys_size = hw_size = nr_phys_segs = nr_hw_segs = 0;
 	rq_for_each_bio(bio, rq) {
 		/* Force bio hw/phys segs to be recalculated. */
 		bio->bi_flags &= ~(1 << BIO_SEG_VALID);
 
-		nr_phys_segs += bio_phys_segments(rq->q, bio);
-		nr_hw_segs += bio_hw_segments(rq->q, bio);
+		nr_phys_segs += bio_phys_segments(q, bio);
+		nr_hw_segs += bio_hw_segments(q, bio);
 		if (prevbio) {
-			if (blk_phys_contig_segment(rq->q, prevbio, bio))
+			int pseg = phys_size + prevbio->bi_size + bio->bi_size;
+			int hseg = hw_size + prevbio->bi_size + bio->bi_size;
+
+			if (blk_phys_contig_segment(q, prevbio, bio) &&
+			    pseg <= q->max_segment_size) {
 				nr_phys_segs--;
-			if (blk_hw_contig_segment(rq->q, prevbio, bio))
+				phys_size += prevbio->bi_size + bio->bi_size;
+			} else
+				phys_size = 0;
+
+			if (blk_hw_contig_segment(q, prevbio, bio) &&
+			    hseg <= q->max_segment_size) {
 				nr_hw_segs--;
+				hw_size += prevbio->bi_size + bio->bi_size;
+			} else
+				hw_size = 0;
 		}
 		prevbio = bio;
 	}


Подробная информация о списке рассылки devel-kernel