]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
md: Relax minimum size restrictions on chunk_size.
authorNeilBrown <neilb@suse.de>
Mon, 13 Oct 2008 00:55:12 +0000 (11:55 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 13 Oct 2008 00:55:12 +0000 (11:55 +1100)
Currently, the 'chunk_size' of an array must be at-least PAGE_SIZE.

This makes moving an array to a machine with a larger PAGE_SIZE, or
changing the kernel to use a larger PAGE_SIZE, can stop an array from
working.

For RAID10 and RAID4/5/6, this is non-trivial to fix as the resync
process works on whole pages at a time, and assumes them to be wholly
within a stripe.  For other raid personalities, this restriction is
not needed at all and can be dropped.

So remove the test on chunk_size from common can, and add it in just
the places where it is needed: raid10 and raid4/5/6.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c
drivers/md/raid10.c
drivers/md/raid5.c

index a29187d1fcf5be0b6abc676511b6a64e27d3e514..be2014f6e37b518c78b9e82ce36b5583c1941065 100644 (file)
@@ -3520,17 +3520,12 @@ static int do_md_run(mddev_t * mddev)
                        return -EINVAL;
                }
                /*
-                * chunk-size has to be a power of 2 and multiples of PAGE_SIZE
+                * chunk-size has to be a power of 2
                 */
                if ( (1 << ffz(~chunk_size)) != chunk_size) {
                        printk(KERN_ERR "chunk_size of %d not valid\n", chunk_size);
                        return -EINVAL;
                }
-               if (chunk_size < PAGE_SIZE) {
-                       printk(KERN_ERR "too small chunk_size: %d < %ld\n",
-                               chunk_size, PAGE_SIZE);
-                       return -EINVAL;
-               }
 
                /* devices must have minimum size of one chunk */
                rdev_for_each(rdev, tmp, mddev) {
index 8bdc9bfc288703aafbc8b20925f3d9b8e337fd54..e3794799f308d8e4ae0634699ab05b2f43927073 100644 (file)
@@ -2028,8 +2028,9 @@ static int run(mddev_t *mddev)
        int nc, fc, fo;
        sector_t stride, size;
 
-       if (mddev->chunk_size == 0) {
-               printk(KERN_ERR "md/raid10: non-zero chunk size required.\n");
+       if (mddev->chunk_size < PAGE_SIZE) {
+               printk(KERN_ERR "md/raid10: chunk size must be "
+                      "at least PAGE_SIZE(%ld).\n", PAGE_SIZE);
                return -EINVAL;
        }
 
index d72be4b89e641dffb8f1257d948701a3850284a4..a36a7435edf51bd29cc32681cb8b211b29a9f8cb 100644 (file)
@@ -4007,6 +4007,13 @@ static int run(mddev_t *mddev)
                return -EIO;
        }
 
+       if (mddev->chunk_size < PAGE_SIZE) {
+               printk(KERN_ERR "md/raid5: chunk_size must be at least "
+                      "PAGE_SIZE but %d < %ld\n",
+                      mddev->chunk_size, PAGE_SIZE);
+               return -EINVAL;
+       }
+
        if (mddev->reshape_position != MaxSector) {
                /* Check that we can continue the reshape.
                 * Currently only disks can change, it must