Prevent users from deactivating the last component of a mirror.
PR: 184985 MFC after: 1 week
This commit is contained in:
parent
f1e3408047
commit
86d162fb60
@ -695,7 +695,7 @@ g_mirror_ctl_deactivate(struct gctl_req *req, struct g_class *mp)
|
||||
const char *name;
|
||||
char param[16];
|
||||
int *nargs;
|
||||
u_int i;
|
||||
u_int i, active;
|
||||
|
||||
nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
|
||||
if (nargs == NULL) {
|
||||
@ -716,6 +716,7 @@ g_mirror_ctl_deactivate(struct gctl_req *req, struct g_class *mp)
|
||||
gctl_error(req, "No such device: %s.", name);
|
||||
return;
|
||||
}
|
||||
active = g_mirror_ndisks(sc, G_MIRROR_DISK_STATE_ACTIVE);
|
||||
for (i = 1; i < (u_int)*nargs; i++) {
|
||||
snprintf(param, sizeof(param), "arg%u", i);
|
||||
name = gctl_get_asciiparam(req, param);
|
||||
@ -728,6 +729,16 @@ g_mirror_ctl_deactivate(struct gctl_req *req, struct g_class *mp)
|
||||
gctl_error(req, "No such provider: %s.", name);
|
||||
continue;
|
||||
}
|
||||
if (disk->d_state == G_MIRROR_DISK_STATE_ACTIVE) {
|
||||
if (active > 1)
|
||||
active--;
|
||||
else {
|
||||
gctl_error(req, "%s: Can't deactivate the "
|
||||
"last ACTIVE component %s.",
|
||||
sc->sc_geom->name, name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
disk->d_flags |= G_MIRROR_DISK_FLAG_INACTIVE;
|
||||
disk->d_flags &= ~G_MIRROR_DISK_FLAG_FORCE_SYNC;
|
||||
g_mirror_update_metadata(disk);
|
||||
|
Loading…
Reference in New Issue
Block a user