Add support for --add-spare

--add-spare is like --add, but a --re-add is never attempted.
So it is equivalent to two separate commands:

 --zero-metadata
 --add

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2013-10-31 10:41:50 +11:00
parent 422da715d9
commit f33a71f107
5 changed files with 23 additions and 2 deletions

View File

@ -783,7 +783,8 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
break; break;
} }
/* FIXME this is a bad test to be using */ /* FIXME this is a bad test to be using */
if (!tst->sb && dv->disposition != 'a') { if (!tst->sb && (dv->disposition != 'a'
&& dv->disposition != 'S')) {
/* we are re-adding a device to a /* we are re-adding a device to a
* completely dead array - have to depend * completely dead array - have to depend
* on kernel to check * on kernel to check
@ -813,7 +814,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
dev_st = dup_super(tst); dev_st = dup_super(tst);
dev_st->ss->load_super(dev_st, tfd, NULL); dev_st->ss->load_super(dev_st, tfd, NULL);
} }
if (dev_st && dev_st->sb) { if (dev_st && dev_st->sb && dv->disposition != 'S') {
int rv = attempt_re_add(fd, tfd, dv, int rv = attempt_re_add(fd, tfd, dv,
dev_st, tst, dev_st, tst,
rdev, rdev,
@ -1237,6 +1238,7 @@ int Manage_subdevs(char *devname, int fd,
* 'a' - add the device * 'a' - add the device
* try HOT_ADD_DISK * try HOT_ADD_DISK
* If that fails EINVAL, try ADD_NEW_DISK * If that fails EINVAL, try ADD_NEW_DISK
* 'S' - add the device as a spare - don't try re-add
* 'A' - re-add the device * 'A' - re-add the device
* 'r' - remove the device: HOT_REMOVE_DISK * 'r' - remove the device: HOT_REMOVE_DISK
* device can be 'faulty' or 'detached' in which case all * device can be 'faulty' or 'detached' in which case all
@ -1447,6 +1449,7 @@ int Manage_subdevs(char *devname, int fd,
dv->devname, dv->disposition); dv->devname, dv->disposition);
goto abort; goto abort;
case 'a': case 'a':
case 'S': /* --add-spare */
case 'A': case 'A':
case 'M': /* --re-add missing */ case 'M': /* --re-add missing */
case 'F': /* --re-add faulty */ case 'F': /* --re-add faulty */

View File

@ -153,6 +153,7 @@ struct option long_options[] = {
/* Management */ /* Management */
{"add", 0, 0, Add}, {"add", 0, 0, Add},
{"add-spare", 0, 0, AddSpare},
{"remove", 0, 0, Remove}, {"remove", 0, 0, Remove},
{"fail", 0, 0, Fail}, {"fail", 0, 0, Fail},
{"set-faulty",0, 0, Fail}, {"set-faulty",0, 0, Fail},

View File

@ -214,7 +214,10 @@ to detect and assemble arrays \(em possibly in an
.P .P
If a device is given before any options, or if the first option is If a device is given before any options, or if the first option is
and of
.BR \-\-add , .BR \-\-add ,
.BR \-\-re\-add ,
.BR \-\-add\-spare ,
.BR \-\-fail , .BR \-\-fail ,
.BR \-\-remove , .BR \-\-remove ,
or or
@ -1297,6 +1300,15 @@ remove them and attempt to immediately re\-add them. This can be
useful if you are certain that the reason for failure has been useful if you are certain that the reason for failure has been
resolved. resolved.
.TP
.B \-\-add\-spare
Add a device as a spare. This is similar to
.B \-\-add
except that it does not attempt
.B \-\-re\-add
first. The device will be added as a spare even if it looks like it
could be an recent member of the array.
.TP .TP
.BR \-r ", " \-\-remove .BR \-r ", " \-\-remove
remove listed devices. They must not be active. i.e. they should remove listed devices. They must not be active. i.e. they should

View File

@ -187,6 +187,7 @@ int main(int argc, char *argv[])
break; break;
case 'a': case 'a':
case Add: case Add:
case AddSpare:
case 'r': case 'r':
case Remove: case Remove:
case Replace: case Replace:
@ -915,6 +916,9 @@ int main(int argc, char *argv[])
case O(MANAGE,Add): /* add a drive */ case O(MANAGE,Add): /* add a drive */
devmode = 'a'; devmode = 'a';
continue; continue;
case O(MANAGE,AddSpare): /* add drive - never re-add */
devmode = 'S';
continue;
case O(MANAGE,ReAdd): case O(MANAGE,ReAdd):
devmode = 'A'; devmode = 'A';
continue; continue;

View File

@ -311,6 +311,7 @@ enum special_options {
Brief, Brief,
ManageOpt, ManageOpt,
Add, Add,
AddSpare,
Remove, Remove,
Fail, Fail,
Replace, Replace,