diff options
| -rw-r--r-- | drivers/md/raid5.c | 39 | ||||
| -rw-r--r-- | drivers/md/raid5.h | 1 |
2 files changed, 27 insertions, 13 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 6a7a30113161..bd4067a70834 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -4566,23 +4566,15 @@ raid5_show_stripe_cache_size(mddev_t *mddev, char *page) | |||
| 4566 | return 0; | 4566 | return 0; |
| 4567 | } | 4567 | } |
| 4568 | 4568 | ||
| 4569 | static ssize_t | 4569 | int |
| 4570 | raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len) | 4570 | raid5_set_cache_size(mddev_t *mddev, int size) |
| 4571 | { | 4571 | { |
| 4572 | raid5_conf_t *conf = mddev->private; | 4572 | raid5_conf_t *conf = mddev->private; |
| 4573 | unsigned long new; | ||
| 4574 | int err; | 4573 | int err; |
| 4575 | 4574 | ||
| 4576 | if (len >= PAGE_SIZE) | 4575 | if (size <= 16 || size > 32768) |
| 4577 | return -EINVAL; | 4576 | return -EINVAL; |
| 4578 | if (!conf) | 4577 | while (size < conf->max_nr_stripes) { |
| 4579 | return -ENODEV; | ||
| 4580 | |||
| 4581 | if (strict_strtoul(page, 10, &new)) | ||
| 4582 | return -EINVAL; | ||
| 4583 | if (new <= 16 || new > 32768) | ||
| 4584 | return -EINVAL; | ||
| 4585 | while (new < conf->max_nr_stripes) { | ||
| 4586 | if (drop_one_stripe(conf)) | 4578 | if (drop_one_stripe(conf)) |
| 4587 | conf->max_nr_stripes--; | 4579 | conf->max_nr_stripes--; |
| 4588 | else | 4580 | else |
| @@ -4591,11 +4583,32 @@ raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len) | |||
| 4591 | err = md_allow_write(mddev); | 4583 | err = md_allow_write(mddev); |
| 4592 | if (err) | 4584 | if (err) |
| 4593 | return err; | 4585 | return err; |
| 4594 | while (new > conf->max_nr_stripes) { | 4586 | while (size > conf->max_nr_stripes) { |
| 4595 | if (grow_one_stripe(conf)) | 4587 | if (grow_one_stripe(conf)) |
| 4596 | conf->max_nr_stripes++; | 4588 | conf->max_nr_stripes++; |
| 4597 | else break; | 4589 | else break; |
| 4598 | } | 4590 | } |
| 4591 | return 0; | ||
| 4592 | } | ||
| 4593 | EXPORT_SYMBOL(raid5_set_cache_size); | ||
| 4594 | |||
| 4595 | static ssize_t | ||
| 4596 | raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len) | ||
| 4597 | { | ||
| 4598 | raid5_conf_t *conf = mddev->private; | ||
| 4599 | unsigned long new; | ||
| 4600 | int err; | ||
| 4601 | |||
| 4602 | if (len >= PAGE_SIZE) | ||
| 4603 | return -EINVAL; | ||
| 4604 | if (!conf) | ||
| 4605 | return -ENODEV; | ||
| 4606 | |||
| 4607 | if (strict_strtoul(page, 10, &new)) | ||
| 4608 | return -EINVAL; | ||
| 4609 | err = raid5_set_cache_size(mddev, new); | ||
| 4610 | if (err) | ||
| 4611 | return err; | ||
| 4599 | return len; | 4612 | return len; |
| 4600 | } | 4613 | } |
| 4601 | 4614 | ||
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 0f86f5e36724..cbdbc77695b3 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h | |||
| @@ -497,4 +497,5 @@ static inline int algorithm_is_DDF(int layout) | |||
| 497 | { | 497 | { |
| 498 | return layout >= 8 && layout <= 10; | 498 | return layout >= 8 && layout <= 10; |
| 499 | } | 499 | } |
| 500 | extern int raid5_set_cache_size(mddev_t *mddev, int size); | ||
| 500 | #endif | 501 | #endif |
