aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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