md/raid5: factor out code for changing size of stripe cache.
authorNeilBrown <neilb@suse.de>
Tue, 1 Jun 2010 09:37:24 +0000 (19:37 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 21 Jul 2010 03:28:15 +0000 (13:28 +1000)
Separate the actual 'change' code from the sysfs interface
so that it can eventually be called internally.

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

index 6a7a301131613e072358179d1d436090612f5267..bd4067a70834a3b10a741e125b8ac1f106487831 100644 (file)
@@ -4566,23 +4566,15 @@ raid5_show_stripe_cache_size(mddev_t *mddev, char *page)
                return 0;
 }
 
-static ssize_t
-raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
+int
+raid5_set_cache_size(mddev_t *mddev, int size)
 {
        raid5_conf_t *conf = mddev->private;
-       unsigned long new;
        int err;
 
-       if (len >= PAGE_SIZE)
+       if (size <= 16 || size > 32768)
                return -EINVAL;
-       if (!conf)
-               return -ENODEV;
-
-       if (strict_strtoul(page, 10, &new))
-               return -EINVAL;
-       if (new <= 16 || new > 32768)
-               return -EINVAL;
-       while (new < conf->max_nr_stripes) {
+       while (size < conf->max_nr_stripes) {
                if (drop_one_stripe(conf))
                        conf->max_nr_stripes--;
                else
@@ -4591,11 +4583,32 @@ raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
        err = md_allow_write(mddev);
        if (err)
                return err;
-       while (new > conf->max_nr_stripes) {
+       while (size > conf->max_nr_stripes) {
                if (grow_one_stripe(conf))
                        conf->max_nr_stripes++;
                else break;
        }
+       return 0;
+}
+EXPORT_SYMBOL(raid5_set_cache_size);
+
+static ssize_t
+raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
+{
+       raid5_conf_t *conf = mddev->private;
+       unsigned long new;
+       int err;
+
+       if (len >= PAGE_SIZE)
+               return -EINVAL;
+       if (!conf)
+               return -ENODEV;
+
+       if (strict_strtoul(page, 10, &new))
+               return -EINVAL;
+       err = raid5_set_cache_size(mddev, new);
+       if (err)
+               return err;
        return len;
 }
 
index 0f86f5e367245da614c99fc0b510777ed5789fec..cbdbc77695b3eacc56401f6e974751b1ad5c5e48 100644 (file)
@@ -497,4 +497,5 @@ static inline int algorithm_is_DDF(int layout)
 {
        return layout >= 8 && layout <= 10;
 }
+extern int raid5_set_cache_size(mddev_t *mddev, int size);
 #endif