blk-settings: align max_sectors on "logical_block_size" boundary
[linux-2.6-microblaze.git] / block / blk-settings.c
index 7dd8be3..b4aa2f3 100644 (file)
@@ -504,6 +504,14 @@ void blk_queue_io_opt(struct request_queue *q, unsigned int opt)
 }
 EXPORT_SYMBOL(blk_queue_io_opt);
 
+static unsigned int blk_round_down_sectors(unsigned int sectors, unsigned int lbs)
+{
+       sectors = round_down(sectors, lbs >> SECTOR_SHIFT);
+       if (sectors < PAGE_SIZE >> SECTOR_SHIFT)
+               sectors = PAGE_SIZE >> SECTOR_SHIFT;
+       return sectors;
+}
+
 /**
  * blk_stack_limits - adjust queue_limits for stacked devices
  * @t: the stacking driver limits (top device)
@@ -630,6 +638,10 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
                ret = -1;
        }
 
+       t->max_sectors = blk_round_down_sectors(t->max_sectors, t->logical_block_size);
+       t->max_hw_sectors = blk_round_down_sectors(t->max_hw_sectors, t->logical_block_size);
+       t->max_dev_sectors = blk_round_down_sectors(t->max_dev_sectors, t->logical_block_size);
+
        /* Discard alignment and granularity */
        if (b->discard_granularity) {
                alignment = queue_limit_discard_alignment(b, start);