]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
re-add: make re-add try to write sysfs node first
authorGuoqing Jiang <gqjiang@suse.com>
Wed, 7 Oct 2015 02:06:54 +0000 (10:06 +0800)
committerNeilBrown <neilb@suse.com>
Thu, 8 Oct 2015 00:08:40 +0000 (11:08 +1100)
If sysfs node existed, we should try to write "re-add" to it.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
Manage.c
mdadm.h
sysfs.c

index b5450dd0d7d80672fd813dc67539266006b61fed..2df303d27cd1c75ba8fe4faf221953e1edae8233 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -1309,6 +1309,7 @@ int Manage_subdevs(char *devname, int fd,
        int sysfd = -1;
        int count = 0; /* number of actions taken */
        struct mdinfo info;
+       struct mdinfo devinfo;
        int frozen = 0;
        int busy = 0;
        int raid_slot = -1;
@@ -1517,6 +1518,18 @@ int Manage_subdevs(char *devname, int fd,
                                pr_err("Cannot add disks to a \'member\' array, perform this operation on the parent container\n");
                                goto abort;
                        }
+
+                       /* Let's first try to write re-add to sysfs */
+                       if (rdev != 0 &&
+                           (dv->disposition == 'A' || dv->disposition == 'F')) {
+                               sysfs_init_dev(&devinfo, rdev);
+                               if (sysfs_set_str(&info, &devinfo, "state", "re-add") == 0) {
+                                       pr_err("re-add %s to %s succeed\n",
+                                               dv->devname, info.sys_name);
+                                       break;
+                               }
+                       }
+
                        if (dv->disposition == 'F')
                                /* Need to remove first */
                                ioctl(fd, HOT_REMOVE_DISK, rdev);
diff --git a/mdadm.h b/mdadm.h
index 6bdaa378ffa33dca9327c9a9a2eeaee591dce7e0..5633663065baa38cbbca8bc1c73a2a49b6ea0543 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -539,6 +539,7 @@ enum sysfs_read_flags {
  */
 extern int sysfs_open(char *devnm, char *devname, char *attr);
 extern void sysfs_init(struct mdinfo *mdi, int fd, char *devnm);
+extern void sysfs_init_dev(struct mdinfo *mdi, unsigned long devid);
 extern void sysfs_free(struct mdinfo *sra);
 extern struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options);
 extern int sysfs_attr_match(const char *attr, const char *str);
diff --git a/sysfs.c b/sysfs.c
index 726847020acbf0814a8360a1181fd85d0bbdf63a..f1fd610bf5875fb6a669e942c60aaf3690176baf 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -74,6 +74,12 @@ int sysfs_open(char *devnm, char *devname, char *attr)
        return fd;
 }
 
+void sysfs_init_dev(struct mdinfo *mdi, unsigned long devid)
+{
+       snprintf(mdi->sys_name,
+                sizeof(mdi->sys_name), "dev-%s", devid2kname(devid));
+}
+
 void sysfs_init(struct mdinfo *mdi, int fd, char *devnm)
 {
        mdi->sys_name[0] = 0;