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