block: Stack optimal I/O size
authorMartin K. Petersen <martin.petersen@oracle.com>
Fri, 31 Jul 2009 15:49:12 +0000 (11:49 -0400)
committerJens Axboe <jens.axboe@oracle.com>
Sat, 1 Aug 2009 08:24:35 +0000 (10:24 +0200)
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>
block/blk-settings.c

index 1f7197434166ee8026fc598daf5846b245b2db98..e1327ddfc13b7ddaebfb54f9c1e22f876d3980fa 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/bio.h>
 #include <linux/blkdev.h>
 #include <linux/bootmem.h>     /* for max_pfn/max_low_pfn */
+#include <linux/gcd.h>
 
 #include "blk.h"
 
@@ -520,6 +521,16 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
                return -1;
        }
 
+       /* Find lcm() of optimal I/O size */
+       if (t->io_opt && b->io_opt)
+               t->io_opt = (t->io_opt * b->io_opt) / gcd(t->io_opt, b->io_opt);
+       else if (b->io_opt)
+               t->io_opt = b->io_opt;
+
+       /* Verify that optimal I/O size is a multiple of io_min */
+       if (t->io_min && t->io_opt % t->io_min)
+               return -1;
+
        return 0;
 }
 EXPORT_SYMBOL(blk_stack_limits);