packages: kernel/kernel.spec, kernel/kernel-scsi-corruption.patch (NEW) - f...

arekm arekm at pld-linux.org
Wed Dec 1 13:56:05 CET 2010


Author: arekm                        Date: Wed Dec  1 12:56:05 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- fix some (very unlikely to happen) scsi problems

---- Files affected:
packages/kernel:
   kernel.spec (1.860 -> 1.861) , kernel-scsi-corruption.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/kernel/kernel.spec
diff -u packages/kernel/kernel.spec:1.860 packages/kernel/kernel.spec:1.861
--- packages/kernel/kernel.spec:1.860	Thu Nov 25 20:20:50 2010
+++ packages/kernel/kernel.spec	Wed Dec  1 13:55:59 2010
@@ -196,6 +196,9 @@
 
 ### End netfilter
 
+# http://marc.info/?l=dm-devel&m=129073232606808&q=raw
+Patch48:	kernel-scsi-corruption.patch
+
 # http://zph.bratcheda.org/linux-2.6.26.3-zph.patch
 Patch49:	kernel-zph.patch
 
@@ -721,6 +724,9 @@
 ##
 # end of netfilter
 
+# scsi
+%patch48 -p1
+
 # zph
 %patch49 -p1
 
@@ -1535,6 +1541,9 @@
 All persons listed below can be reached at <cvs_login>@pld-linux.org
 
 $Log$
+Revision 1.861  2010/12/01 12:55:59  arekm
+- fix some (very unlikely to happen) scsi problems
+
 Revision 1.860  2010/11/25 19:20:50  arekm
 - rel 2
 

================================================================
Index: packages/kernel/kernel-scsi-corruption.patch
diff -u /dev/null packages/kernel/kernel-scsi-corruption.patch:1.1
--- /dev/null	Wed Dec  1 13:56:05 2010
+++ packages/kernel/kernel-scsi-corruption.patch	Wed Dec  1 13:55:59 2010
@@ -0,0 +1,246 @@
+>>>>> "Jens" == Jens Axboe <jaxboe at fusionio.com> writes:
+
+Jens> Great, the two different values and needing to sync them was
+Jens> horrible.  What kind of testing did you do? Have to be a little
+Jens> extra careful at this point.
+
+Yeah, we should probably let it soak a bit in -next just to make sure.
+
+There really aren't many devices from this millennium that don't support
+clustering. Which I guess is why we haven't seen any problems.
+
+I ended up disabling clustering in one of the FC drivers to test with a
+real workload. Threw in a BUG_ON(nsegs > queue_max_segments(q)) for good
+measure.
+
+I also tested mixing and matching clustered and non-clustered bottom
+devices while stacking with DM.
+
+New version below, fixing the things you and Matthew pointed out...
+
+
+
+block: Deprecate QUEUE_FLAG_CLUSTER and use queue_limits instead
+
+When stacking devices, a request_queue is not always available. This
+forced us to have a no_cluster flag in the queue_limits that could be
+used as a carrier until the request_queue had been set up for a
+metadevice.
+
+There were several problems with that approach. First of all it was up
+to the stacking device to remember to set queue flag after stacking had
+completed. Also, the queue flag and the queue limits had to be kept in
+sync at all times. We got that wrong, which could lead to us issuing
+commands that went beyond the max scatterlist limit set by the driver.
+
+The proper fix is to avoid having two flags for tracking the same thing.
+We deprecate QUEUE_FLAG_CLUSTER and use the queue limit directly in the
+block layer merging functions. The queue_limit 'no_cluster' is turned
+into 'cluster' to avoid double negatives and to ease stacking.
+Clustering defaults to being enabled as before. The queue flag logic is
+removed from the stacking function, and explicitly setting the cluster
+flag is no longer necessary in DM and MD.
+
+Reported-by: Ed Lin <ed.lin at promise.com>
+Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>
+
+diff --git a/block/blk-merge.c b/block/blk-merge.c
+index 77b7c26..74bc4a7 100644
+--- a/block/blk-merge.c
++++ b/block/blk-merge.c
+@@ -21,7 +21,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
+ 		return 0;
+ 
+ 	fbio = bio;
+-	cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
++	cluster = blk_queue_cluster(q);
+ 	seg_size = 0;
+ 	nr_phys_segs = 0;
+ 	for_each_bio(bio) {
+@@ -87,7 +87,7 @@ EXPORT_SYMBOL(blk_recount_segments);
+ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio,
+ 				   struct bio *nxt)
+ {
+-	if (!test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags))
++	if (!blk_queue_cluster(q))
+ 		return 0;
+ 
+ 	if (bio->bi_seg_back_size + nxt->bi_seg_front_size >
+@@ -123,7 +123,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
+ 	int nsegs, cluster;
+ 
+ 	nsegs = 0;
+-	cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
++	cluster = blk_queue_cluster(q);
+ 
+ 	/*
+ 	 * for each bio in rq
+diff --git a/block/blk-settings.c b/block/blk-settings.c
+index 701859f..e55f5fc 100644
+--- a/block/blk-settings.c
++++ b/block/blk-settings.c
+@@ -126,7 +126,7 @@ void blk_set_default_limits(struct queue_limits *lim)
+ 	lim->alignment_offset = 0;
+ 	lim->io_opt = 0;
+ 	lim->misaligned = 0;
+-	lim->no_cluster = 0;
++	lim->cluster = 1;
+ }
+ EXPORT_SYMBOL(blk_set_default_limits);
+ 
+@@ -464,15 +464,6 @@ EXPORT_SYMBOL(blk_queue_io_opt);
+ void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b)
+ {
+ 	blk_stack_limits(&t->limits, &b->limits, 0);
+-
+-	if (!t->queue_lock)
+-		WARN_ON_ONCE(1);
+-	else if (!test_bit(QUEUE_FLAG_CLUSTER, &b->queue_flags)) {
+-		unsigned long flags;
+-		spin_lock_irqsave(t->queue_lock, flags);
+-		queue_flag_clear(QUEUE_FLAG_CLUSTER, t);
+-		spin_unlock_irqrestore(t->queue_lock, flags);
+-	}
+ }
+ EXPORT_SYMBOL(blk_queue_stack_limits);
+ 
+@@ -545,7 +536,7 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
+ 	t->io_min = max(t->io_min, b->io_min);
+ 	t->io_opt = lcm(t->io_opt, b->io_opt);
+ 
+-	t->no_cluster |= b->no_cluster;
++	t->cluster &= b->cluster;
+ 	t->discard_zeroes_data &= b->discard_zeroes_data;
+ 
+ 	/* Physical block size a multiple of the logical block size? */
+@@ -641,7 +632,6 @@ void disk_stack_limits(struct gendisk *disk, struct block_device *bdev,
+ 		       sector_t offset)
+ {
+ 	struct request_queue *t = disk->queue;
+-	struct request_queue *b = bdev_get_queue(bdev);
+ 
+ 	if (bdev_stack_limits(&t->limits, bdev, offset >> 9) < 0) {
+ 		char top[BDEVNAME_SIZE], bottom[BDEVNAME_SIZE];
+@@ -652,17 +642,6 @@ void disk_stack_limits(struct gendisk *disk, struct block_device *bdev,
+ 		printk(KERN_NOTICE "%s: Warning: Device %s is misaligned\n",
+ 		       top, bottom);
+ 	}
+-
+-	if (!t->queue_lock)
+-		WARN_ON_ONCE(1);
+-	else if (!test_bit(QUEUE_FLAG_CLUSTER, &b->queue_flags)) {
+-		unsigned long flags;
+-
+-		spin_lock_irqsave(t->queue_lock, flags);
+-		if (!test_bit(QUEUE_FLAG_CLUSTER, &b->queue_flags))
+-			queue_flag_clear(QUEUE_FLAG_CLUSTER, t);
+-		spin_unlock_irqrestore(t->queue_lock, flags);
+-	}
+ }
+ EXPORT_SYMBOL(disk_stack_limits);
+ 
+diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
+index 013457f..41fb691 100644
+--- a/block/blk-sysfs.c
++++ b/block/blk-sysfs.c
+@@ -119,7 +119,7 @@ static ssize_t queue_max_integrity_segments_show(struct request_queue *q, char *
+ 
+ static ssize_t queue_max_segment_size_show(struct request_queue *q, char *page)
+ {
+-	if (test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags))
++	if (blk_queue_cluster(q))
+ 		return queue_var_show(queue_max_segment_size(q), (page));
+ 
+ 	return queue_var_show(PAGE_CACHE_SIZE, (page));
+diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
+index 90267f8..e2da191 100644
+--- a/drivers/md/dm-table.c
++++ b/drivers/md/dm-table.c
+@@ -1131,11 +1131,6 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
+ 	 */
+ 	q->limits = *limits;
+ 
+-	if (limits->no_cluster)
+-		queue_flag_clear_unlocked(QUEUE_FLAG_CLUSTER, q);
+-	else
+-		queue_flag_set_unlocked(QUEUE_FLAG_CLUSTER, q);
+-
+ 	if (!dm_table_supports_discards(t))
+ 		queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, q);
+ 	else
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index 84c46a1..52694d2 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -4296,9 +4296,6 @@ static int md_alloc(dev_t dev, char *name)
+ 		goto abort;
+ 	mddev->queue->queuedata = mddev;
+ 
+-	/* Can be unlocked because the queue is new: no concurrency */
+-	queue_flag_set_unlocked(QUEUE_FLAG_CLUSTER, mddev->queue);
+-
+ 	blk_queue_make_request(mddev->queue, md_make_request);
+ 
+ 	disk = alloc_disk(1 << shift);
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index b55b0ec..3852e51 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -1643,9 +1643,8 @@ struct request_queue *__scsi_alloc_queue(struct Scsi_Host *shost,
+ 
+ 	blk_queue_max_segment_size(q, dma_get_max_seg_size(dev));
+ 
+-	/* New queue, no concurrency on queue_flags */
+ 	if (!shost->use_clustering)
+-		queue_flag_clear_unlocked(QUEUE_FLAG_CLUSTER, q);
++		q->limits.cluster = 0;
+ 
+ 	/*
+ 	 * set a reasonable default alignment on word boundaries: the
+diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
+index aae86fd..95aeeeb 100644
+--- a/include/linux/blkdev.h
++++ b/include/linux/blkdev.h
+@@ -250,7 +250,7 @@ struct queue_limits {
+ 
+ 	unsigned char		misaligned;
+ 	unsigned char		discard_misaligned;
+-	unsigned char		no_cluster;
++	unsigned char		cluster;
+ 	signed char		discard_zeroes_data;
+ };
+ 
+@@ -380,7 +380,6 @@ struct request_queue
+ #endif
+ };
+ 
+-#define QUEUE_FLAG_CLUSTER	0	/* cluster several segments into 1 */
+ #define QUEUE_FLAG_QUEUED	1	/* uses generic tag queueing */
+ #define QUEUE_FLAG_STOPPED	2	/* queue is stopped */
+ #define	QUEUE_FLAG_SYNCFULL	3	/* read queue has been filled */
+@@ -403,7 +402,6 @@ struct request_queue
+ #define QUEUE_FLAG_SECDISCARD  19	/* supports SECDISCARD */
+ 
+ #define QUEUE_FLAG_DEFAULT	((1 << QUEUE_FLAG_IO_STAT) |		\
+-				 (1 << QUEUE_FLAG_CLUSTER) |		\
+ 				 (1 << QUEUE_FLAG_STACKABLE)	|	\
+ 				 (1 << QUEUE_FLAG_SAME_COMP)	|	\
+ 				 (1 << QUEUE_FLAG_ADD_RANDOM))
+@@ -510,6 +508,11 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q)
+ 
+ #define rq_data_dir(rq)		((rq)->cmd_flags & 1)
+ 
++static inline unsigned int blk_queue_cluster(struct request_queue *q)
++{
++	return q->limits.cluster;
++}
++
+ /*
+  * We regard a request as sync, if either a read or a sync write
+  */
+
+
+--
+dm-devel mailing list
+dm-devel at redhat.com
+https://www.redhat.com/mailman/listinfo/dm-devel
\ No newline at end of file
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel.spec?r1=1.860&r2=1.861&f=u



More information about the pld-cvs-commit mailing list