From: Adam Kwolek Date: Wed, 21 Sep 2011 01:55:08 +0000 (+1000) Subject: FIX: Do not unblock array accidentally X-Git-Tag: mdadm-3.2.3~158 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ddb12f6ca6c1b04fcc79f114f5d47d6c268ed37a;p=thirdparty%2Fmdadm.git FIX: Do not unblock array accidentally When sysfs_set_array() function is called, it tests if array can be configured using sysfs. Setting metadata_version entry can accidentally unblock mdmon when array is under reshape. To avoid this, blocking character '-' is checked and if is is set, it is used for array test. Signed-off-by: Adam Kwolek Signed-off-by: NeilBrown --- diff --git a/sysfs.c b/sysfs.c index 21462642..e1aaf4d9 100644 --- a/sysfs.c +++ b/sysfs.c @@ -541,8 +541,21 @@ int sysfs_set_array(struct mdinfo *info, int vers) ver[0] = 0; if (info->array.major_version == -1 && info->array.minor_version == -2) { + char buf[1024]; + strcat(strcpy(ver, "external:"), info->text_version); + /* meta version might already be set if we are setting + * new geometry for a reshape. In that case we don't + * want to over-write the 'readonly' flag that is + * stored in the metadata version. So read the current + * version first, and preserve the flag + */ + if (sysfs_get_str(info, NULL, "metadata_version", + buf, 1024) > 0) + if (strlen(buf) >= 9 && buf[9] == '-') + ver[9] = '-'; + if ((vers % 100) < 2 || sysfs_set_str(info, NULL, "metadata_version", ver) < 0) {