aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2008-07-11 20:37:50 -0400
committerNeilBrown <neilb@suse.de>2008-07-21 00:22:18 -0400
commitd7027458d68b2f1752a28016dcf2ffd0a7e8f567 (patch)
tree03bb7d75f4951eba4eff21926d1ce71c6d728260
parent7e93a89251d4ed7bd4475db62616ccd03ddfd01a (diff)
md: Tidy up rdev_size_store a bit:
- used strict_strtoull in place of simple_strtoull - use my_mddev in place of rdev->mddev (they have the same value) and more significantly, - don't adjust mddev->size to fit, rather reject changes which make rdev->size smaller than mddev->size Adjusting mddev->size is a hangover from bind_rdev_to_array which does a similar thing. But it really is a better design to insist that mddev->size is set as required, then the rdev->sizes are set to allow for that. The previous way invites confusion. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Documentation/md.txt2
-rw-r--r--drivers/md/md.c17
2 files changed, 9 insertions, 10 deletions
diff --git a/Documentation/md.txt b/Documentation/md.txt
index e06cc59437e4..1da9d1b1793f 100644
--- a/Documentation/md.txt
+++ b/Documentation/md.txt
@@ -347,7 +347,7 @@ Each directory contains:
347 for storage of data. This will normally be the same as the 347 for storage of data. This will normally be the same as the
348 component_size. This can be written while assembling an 348 component_size. This can be written while assembling an
349 array. If a value less than the current component_size is 349 array. If a value less than the current component_size is
350 written, component_size will be reduced to this value. 350 written, it will be rejected.
351 351
352 352
353An active md device will also contain and entry for each active device 353An active md device will also contain and entry for each active device
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 5590cb54b584..95466bb089ab 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2101,16 +2101,17 @@ static int overlaps(sector_t s1, sector_t l1, sector_t s2, sector_t l2)
2101static ssize_t 2101static ssize_t
2102rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) 2102rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2103{ 2103{
2104 char *e; 2104 unsigned long long size;
2105 unsigned long long size = simple_strtoull(buf, &e, 10);
2106 unsigned long long oldsize = rdev->size; 2105 unsigned long long oldsize = rdev->size;
2107 mddev_t *my_mddev = rdev->mddev; 2106 mddev_t *my_mddev = rdev->mddev;
2108 2107
2109 if (e==buf || (*e && *e != '\n')) 2108 if (strict_strtoull(buf, 10, &size) < 0)
2109 return -EINVAL;
2110 if (size < my_mddev->size)
2110 return -EINVAL; 2111 return -EINVAL;
2111 if (my_mddev->pers && rdev->raid_disk >= 0) { 2112 if (my_mddev->pers && rdev->raid_disk >= 0) {
2112 if (rdev->mddev->persistent) { 2113 if (my_mddev->persistent) {
2113 size = super_types[rdev->mddev->major_version]. 2114 size = super_types[my_mddev->major_version].
2114 rdev_size_change(rdev, size); 2115 rdev_size_change(rdev, size);
2115 if (!size) 2116 if (!size)
2116 return -EBUSY; 2117 return -EBUSY;
@@ -2118,12 +2119,12 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2118 size = (rdev->bdev->bd_inode->i_size >> 10); 2119 size = (rdev->bdev->bd_inode->i_size >> 10);
2119 size -= rdev->data_offset/2; 2120 size -= rdev->data_offset/2;
2120 } 2121 }
2121 if (size < rdev->mddev->size) 2122 if (size < my_mddev->size)
2122 return -EINVAL; /* component must fit device */ 2123 return -EINVAL; /* component must fit device */
2123 } 2124 }
2124 2125
2125 rdev->size = size; 2126 rdev->size = size;
2126 if (size > oldsize && rdev->mddev->external) { 2127 if (size > oldsize && my_mddev->external) {
2127 /* need to check that all other rdevs with the same ->bdev 2128 /* need to check that all other rdevs with the same ->bdev
2128 * do not overlap. We need to unlock the mddev to avoid 2129 * do not overlap. We need to unlock the mddev to avoid
2129 * a deadlock. We have already changed rdev->size, and if 2130 * a deadlock. We have already changed rdev->size, and if
@@ -2165,8 +2166,6 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2165 return -EBUSY; 2166 return -EBUSY;
2166 } 2167 }
2167 } 2168 }
2168 if (size < my_mddev->size || my_mddev->size == 0)
2169 my_mddev->size = size;
2170 return len; 2169 return len;
2171} 2170}
2172 2171