]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Manage: freeze recovery while adding multiple devices.
authorNeilBrown <neilb@suse.de>
Thu, 22 Mar 2012 05:15:03 +0000 (16:15 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 22 Mar 2012 05:15:03 +0000 (16:15 +1100)
If the kernel supports it, freeze recovery over multiple adds,
so that they can all be added to the array at the same time and
be recovered in parallel.

Signed-off-by: NeilBrown <neilb@suse.de>
Manage.c

index f53fe276e5bcd9f30fd9f14758c9a24fa1fedfd9..7deba3aa0d66ead2f41a1fffc7b6fb4f7ecdd30d 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -416,12 +416,15 @@ int Manage_subdevs(char *devname, int fd,
        int lfd = -1;
        int sysfd = -1;
        int count = 0; /* number of actions taken */
+       struct mdinfo info;
+       int frozen = 0;
 
        if (ioctl(fd, GET_ARRAY_INFO, &array)) {
                fprintf(stderr, Name ": cannot get array info for %s\n",
                        devname);
                goto abort;
        }
+       sysfs_init(&info, fd, 0);
 
        /* array.size is only 32 bit and may be truncated.
         * So read from sysfs if possible, and record number of sectors
@@ -629,6 +632,12 @@ int Manage_subdevs(char *devname, int fd,
                                        dv->devname, strerror(errno));
                                goto abort;
                        }
+                       if (!frozen) {
+                               if (sysfs_freeze_array(&info) == 1)
+                                       frozen = 1;
+                               else
+                                       frozen = -1;
+                       }
 
                        st = dup_super(tst);
 
@@ -1166,11 +1175,15 @@ int Manage_subdevs(char *devname, int fd,
                        break;
                }
        }
+       if (frozen > 0)
+               sysfs_set_str(&info, NULL, "sync_action","idle");
        if (test && count == 0)
                return 2;
        return 0;
 
 abort:
+       if (frozen > 0)
+               sysfs_set_str(&info, NULL, "sync_action","idle");
        return 1;
 }