]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
FIX: Do not unblock array accidentally
authorAdam Kwolek <adam.kwolek@intel.com>
Wed, 21 Sep 2011 01:55:08 +0000 (11:55 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 21 Sep 2011 01:55:08 +0000 (11:55 +1000)
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 <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
sysfs.c

diff --git a/sysfs.c b/sysfs.c
index 2146264225a7a64659d2588031bbc19c78927ab6..e1aaf4d9457804ecd7f7aab1f71bbf68d7235d91 100644 (file)
--- 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) {