Manage: freeze recovery while adding multiple devices.
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>
This commit is contained in:
parent
bcbb3112d2
commit
9f58469128
13
Manage.c
13
Manage.c
|
@ -416,12 +416,15 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
int lfd = -1;
|
int lfd = -1;
|
||||||
int sysfd = -1;
|
int sysfd = -1;
|
||||||
int count = 0; /* number of actions taken */
|
int count = 0; /* number of actions taken */
|
||||||
|
struct mdinfo info;
|
||||||
|
int frozen = 0;
|
||||||
|
|
||||||
if (ioctl(fd, GET_ARRAY_INFO, &array)) {
|
if (ioctl(fd, GET_ARRAY_INFO, &array)) {
|
||||||
fprintf(stderr, Name ": cannot get array info for %s\n",
|
fprintf(stderr, Name ": cannot get array info for %s\n",
|
||||||
devname);
|
devname);
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
|
sysfs_init(&info, fd, 0);
|
||||||
|
|
||||||
/* array.size is only 32 bit and may be truncated.
|
/* array.size is only 32 bit and may be truncated.
|
||||||
* So read from sysfs if possible, and record number of sectors
|
* 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));
|
dv->devname, strerror(errno));
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
|
if (!frozen) {
|
||||||
|
if (sysfs_freeze_array(&info) == 1)
|
||||||
|
frozen = 1;
|
||||||
|
else
|
||||||
|
frozen = -1;
|
||||||
|
}
|
||||||
|
|
||||||
st = dup_super(tst);
|
st = dup_super(tst);
|
||||||
|
|
||||||
|
@ -1166,11 +1175,15 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (frozen > 0)
|
||||||
|
sysfs_set_str(&info, NULL, "sync_action","idle");
|
||||||
if (test && count == 0)
|
if (test && count == 0)
|
||||||
return 2;
|
return 2;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
abort:
|
abort:
|
||||||
|
if (frozen > 0)
|
||||||
|
sysfs_set_str(&info, NULL, "sync_action","idle");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue