Author: ae
Date: Thu Dec 19 22:13:12 2013
New Revision: 259634
URL: http://svnweb.freebsd.org/changeset/base/259634

Log:
  Prevent users from deactivating the last component of a mirror.
  
  PR:           184985
  MFC after:    1 week

Modified:
  head/sys/geom/mirror/g_mirror_ctl.c

Modified: head/sys/geom/mirror/g_mirror_ctl.c
==============================================================================
--- head/sys/geom/mirror/g_mirror_ctl.c Thu Dec 19 21:35:33 2013        
(r259633)
+++ head/sys/geom/mirror/g_mirror_ctl.c Thu Dec 19 22:13:12 2013        
(r259634)
@@ -695,7 +695,7 @@ g_mirror_ctl_deactivate(struct gctl_req 
        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 
                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 
                        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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to