md/raid5: make sure stripe_size as power of two
authorYufen Yu <yuyufen@huawei.com>
Thu, 20 Aug 2020 13:22:05 +0000 (09:22 -0400)
committerSong Liu <songliubraving@fb.com>
Fri, 28 Aug 2020 05:41:03 +0000 (22:41 -0700)
Commit 3b5408b98e4d ("md/raid5: support config stripe_size by sysfs
entry") make stripe_size as a configurable value. It just requires
stripe_size as multiple of 4KB.

In fact, we should make sure stripe_size as power of two. Otherwise,
stripe_shift which is the result of ilog2 can not represent the real
stripe_size. Then, stripe_hash() and stripe_hash_locks_hash() may
get unexpected value.

Fixes: 3b5408b98e4d ("md/raid5: support config stripe_size by sysfs entry")
Signed-off-by: Yufen Yu <yuyufen@huawei.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
drivers/md/raid5.c

index ef0fd4830803f00c1142ee7feebb55bf91840b26..a095c7a4cd7cbf02a052edcc3b1ef28e0ad8e5d1 100644 (file)
@@ -6514,9 +6514,12 @@ raid5_store_stripe_size(struct mddev  *mddev, const char *page, size_t len)
 
        /*
         * The value should not be bigger than PAGE_SIZE. It requires to
-        * be multiple of DEFAULT_STRIPE_SIZE.
+        * be multiple of DEFAULT_STRIPE_SIZE and the value should be power
+        * of two.
         */
-       if (new % DEFAULT_STRIPE_SIZE != 0 || new > PAGE_SIZE || new == 0)
+       if (new % DEFAULT_STRIPE_SIZE != 0 ||
+                       new > PAGE_SIZE || new == 0 ||
+                       new != roundup_pow_of_two(new))
                return -EINVAL;
 
        err = mddev_lock(mddev);