aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
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 /drivers/md/md.c
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>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c17
1 files changed, 8 insertions, 9 deletions
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