summaryrefslogtreecommitdiff
path: root/Grow.c
diff options
context:
space:
mode:
authorAdam Kwolek <adam.kwolek@intel.com>2012-02-16 14:16:04 +0100
committerNeilBrown <neilb@suse.de>2012-02-20 14:10:11 +1100
commit178950eacc814d50cbc61cd70ebb346aa67e2a03 (patch)
treef006f89c7692f800e456736a0d9c59fc399cb171 /Grow.c
parentd669228f295e4c695475f0c1f7dc52f514a177c4 (diff)
FIX: Changes in '0' case for reshape position verification
Reading sysfs entry that is '0' long should cause an error. Reshape position cannot be empty. Absence of reshape position should be ignored. It is possible that we are about raid0 reshape continuation and it is before takeover. This means that according metadata (changed by mdmon) it should be reshaped but md knows nothing about it at this moment. Reshape continuation in reshape_array() will change it to raid4 and reshape position appears in sysfs. Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Grow.c')
-rw-r--r--Grow.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/Grow.c b/Grow.c
index 53a7cad7..239b50d6 100644
--- a/Grow.c
+++ b/Grow.c
@@ -1876,9 +1876,12 @@ static int verify_reshape_position(struct mdinfo *info, int level)
{
int ret_val = 0;
char buf[40];
+ int rv;
/* read sync_max, failure can mean raid0 array */
- if (sysfs_get_str(info, NULL, "sync_max", buf, 40) > 0) {
+ rv = sysfs_get_str(info, NULL, "sync_max", buf, 40);
+
+ if (rv > 0) {
char *ep;
unsigned long long position = strtoull(buf, &ep, 0);
@@ -1906,6 +1909,11 @@ static int verify_reshape_position(struct mdinfo *info, int level)
ret_val = 1;
}
}
+ } else if (rv == 0) {
+ /* for valid sysfs entry, 0-length content
+ * should be indicated as error
+ */
+ ret_val = -1;
}
return ret_val;
@@ -3975,7 +3983,7 @@ int Grow_continue_command(char *devname, int fd,
* correct position
*/
if (verify_reshape_position(content,
- map_name(pers, mdstat->level)) <= 0) {
+ map_name(pers, mdstat->level)) < 0) {
ret_val = 1;
goto Grow_continue_command_exit;
}