dm table: establish queue limits by copying table limits
authorMike Snitzer <snitzer@redhat.com>
Mon, 22 Jun 2009 09:12:32 +0000 (10:12 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Mon, 22 Jun 2009 09:12:32 +0000 (10:12 +0100)
Copy the table's queue_limits to the DM device's request_queue.  This
properly initializes the queue's topology limits and also avoids having
to track the evolution of 'struct queue_limits' in
dm_table_set_restrictions()

Also fixes a bug that was introduced in dm_table_set_restrictions() via
commit ae03bf639a5027d27270123f5f6e3ee6a412781d.  In addition to
establishing 'bounce_pfn' in the queue's limits blk_queue_bounce_limit()
also performs an allocation to setup the ISA DMA pool.  This allocation
resulted in "sleeping function called from invalid context" when called
from dm_table_set_restrictions().

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
drivers/md/dm-table.c

index 41ec2bf9fbe9a12e624cce4afd2db663eaf3ea58..267817edc844023f2de3b399770e6f195b7ff227 100644 (file)
@@ -956,17 +956,9 @@ no_integrity:
 void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q)
 {
        /*
-        * Make sure we obey the optimistic sub devices
-        * restrictions.
+        * Copy table's limits to the DM device's request_queue
         */
-       blk_queue_max_sectors(q, t->limits.max_sectors);
-       blk_queue_max_phys_segments(q, t->limits.max_phys_segments);
-       blk_queue_max_hw_segments(q, t->limits.max_hw_segments);
-       blk_queue_logical_block_size(q, t->limits.logical_block_size);
-       blk_queue_max_segment_size(q, t->limits.max_segment_size);
-       blk_queue_max_hw_sectors(q, t->limits.max_hw_sectors);
-       blk_queue_segment_boundary(q, t->limits.seg_boundary_mask);
-       blk_queue_bounce_limit(q, t->limits.bounce_pfn);
+       q->limits = t->limits;
 
        if (t->limits.no_cluster)
                queue_flag_clear_unlocked(QUEUE_FLAG_CLUSTER, q);