Author: pjd
Date: Fri Oct 22 22:58:00 2010
New Revision: 214229
URL: http://svn.freebsd.org/changeset/base/214229

Log:
  - Improve error messages, so instead of 'Not fully done', the user will get
    information that device is already suspended or that device is using
    one-time key and suspend is not supported.
  - 'geli suspend -a' silently skips devices that use one-time key, this is 
fine,
    but because we log which device were suspended on the console, log also 
which
    devices were skipped.

Modified:
  head/sys/geom/eli/g_eli_ctl.c

Modified: head/sys/geom/eli/g_eli_ctl.c
==============================================================================
--- head/sys/geom/eli/g_eli_ctl.c       Fri Oct 22 22:54:26 2010        
(r214228)
+++ head/sys/geom/eli/g_eli_ctl.c       Fri Oct 22 22:58:00 2010        
(r214229)
@@ -699,22 +699,28 @@ g_eli_ctl_delkey(struct gctl_req *req, s
                G_ELI_DEBUG(1, "Key %d removed from %s.", nkey, pp->name);
 }
 
-static int
-g_eli_suspend_one(struct g_eli_softc *sc)
+static void
+g_eli_suspend_one(struct g_eli_softc *sc, struct gctl_req *req)
 {
        struct g_eli_worker *wr;
 
        g_topology_assert();
 
-       if (sc == NULL)
-               return (ENOENT);
-       if (sc->sc_flags & G_ELI_FLAG_ONETIME)
-               return (EOPNOTSUPP);
+       KASSERT(sc != NULL, ("NULL sc"));
+
+       if (sc->sc_flags & G_ELI_FLAG_ONETIME) {
+               gctl_error(req,
+                   "Device %s is using one-time key, suspend not supported.",
+                   sc->sc_name);
+               return;
+       }
 
        mtx_lock(&sc->sc_queue_mtx);
        if (sc->sc_flags & G_ELI_FLAG_SUSPEND) {
                mtx_unlock(&sc->sc_queue_mtx);
-               return (EALREADY);
+               gctl_error(req, "Device %s already suspended.",
+                   sc->sc_name);
+               return;
        }
        sc->sc_flags |= G_ELI_FLAG_SUSPEND;
        wakeup(sc);
@@ -742,8 +748,7 @@ g_eli_suspend_one(struct g_eli_softc *sc
        bzero(sc->sc_ivkey, sizeof(sc->sc_ivkey));
        bzero(&sc->sc_ivctx, sizeof(sc->sc_ivctx));
        mtx_unlock(&sc->sc_queue_mtx);
-       G_ELI_DEBUG(0, "%s has been suspended.", sc->sc_name);
-       return (0);
+       G_ELI_DEBUG(0, "Device %s has been suspended.", sc->sc_name);
 }
 
 static void
@@ -751,7 +756,6 @@ g_eli_ctl_suspend(struct gctl_req *req, 
 {
        struct g_eli_softc *sc;
        int *all, *nargs;
-       int error;
 
        g_topology_assert();
 
@@ -775,11 +779,13 @@ g_eli_ctl_suspend(struct gctl_req *req, 
 
                LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) {
                        sc = gp->softc;
-                       if (sc->sc_flags & G_ELI_FLAG_ONETIME)
+                       if (sc->sc_flags & G_ELI_FLAG_ONETIME) {
+                               G_ELI_DEBUG(0,
+                                   "Device %s is using one-time key, suspend 
not supported, skipping.",
+                                   sc->sc_name);
                                continue;
-                       error = g_eli_suspend_one(sc);
-                       if (error != 0)
-                               gctl_error(req, "Not fully done.");
+                       }
+                       g_eli_suspend_one(sc, req);
                }
        } else {
                const char *prov;
@@ -799,9 +805,7 @@ g_eli_ctl_suspend(struct gctl_req *req, 
                                G_ELI_DEBUG(0, "No such provider: %s.", prov);
                                continue;
                        }
-                       error = g_eli_suspend_one(sc);
-                       if (error != 0)
-                               gctl_error(req, "Not fully done.");
+                       g_eli_suspend_one(sc, req);
                }
        }
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to