aboutsummaryrefslogtreecommitdiffstats
path: root/block/blk-settings.c
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2009-07-31 11:49:12 -0400
committerJens Axboe <jens.axboe@oracle.com>2009-08-01 04:24:35 -0400
commit70dd5bf3b99964d52862ad2810c24cc32a553535 (patch)
tree912cef9cf7545b9019ad4c54def7f651213f2725 /block/blk-settings.c
parent7c958e32649e0c35801762878fb0b6da8c55a515 (diff)
block: Stack optimal I/O size
When stacking block devices ensure that optimal I/O size is scaled accordingly. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/blk-settings.c')
-rw-r--r--block/blk-settings.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/block/blk-settings.c b/block/blk-settings.c
index 1f7197434166..e1327ddfc13b 100644
--- a/block/blk-settings.c
+++ b/block/blk-settings.c
@@ -7,6 +7,7 @@
7#include <linux/bio.h> 7#include <linux/bio.h>
8#include <linux/blkdev.h> 8#include <linux/blkdev.h>
9#include <linux/bootmem.h> /* for max_pfn/max_low_pfn */ 9#include <linux/bootmem.h> /* for max_pfn/max_low_pfn */
10#include <linux/gcd.h>
10 11
11#include "blk.h" 12#include "blk.h"
12 13
@@ -520,6 +521,16 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
520 return -1; 521 return -1;
521 } 522 }
522 523
524 /* Find lcm() of optimal I/O size */
525 if (t->io_opt && b->io_opt)
526 t->io_opt = (t->io_opt * b->io_opt) / gcd(t->io_opt, b->io_opt);
527 else if (b->io_opt)
528 t->io_opt = b->io_opt;
529
530 /* Verify that optimal I/O size is a multiple of io_min */
531 if (t->io_min && t->io_opt % t->io_min)
532 return -1;
533
523 return 0; 534 return 0;
524} 535}
525EXPORT_SYMBOL(blk_stack_limits); 536EXPORT_SYMBOL(blk_stack_limits);