Author: trasz
Date: Wed Feb 10 19:01:26 2016
New Revision: 295483
URL: https://svnweb.freebsd.org/changeset/base/295483

Log:
  Add a kern.icl.drivers sysctl, to retrieve the list of registered
  ICL drivers.
  
  MFC after:    1 month
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/dev/iscsi/icl.c

Modified: head/sys/dev/iscsi/icl.c
==============================================================================
--- head/sys/dev/iscsi/icl.c    Wed Feb 10 18:54:18 2016        (r295482)
+++ head/sys/dev/iscsi/icl.c    Wed Feb 10 19:01:26 2016        (r295483)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mutex.h>
 #include <sys/module.h>
 #include <sys/queue.h>
+#include <sys/sbuf.h>
 #include <sys/sysctl.h>
 #include <sys/systm.h>
 #include <sys/sx.h>
@@ -66,13 +67,42 @@ struct icl_softc {
        TAILQ_HEAD(, icl_module)        sc_modules;
 };
 
+static int sysctl_kern_icl_drivers(SYSCTL_HANDLER_ARGS);
+static MALLOC_DEFINE(M_ICL, "icl", "iSCSI Common Layer");
+static struct icl_softc        *sc;
+
 SYSCTL_NODE(_kern, OID_AUTO, icl, CTLFLAG_RD, 0, "iSCSI Common Layer");
 int icl_debug = 1;
 SYSCTL_INT(_kern_icl, OID_AUTO, debug, CTLFLAG_RWTUN,
     &icl_debug, 0, "Enable debug messages");
+SYSCTL_PROC(_kern_icl, OID_AUTO, drivers,
+    CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
+    NULL, 0, sysctl_kern_icl_drivers, "A",
+    "List of ICL drivers");
 
-static MALLOC_DEFINE(M_ICL, "icl", "iSCSI Common Layer");
-static struct icl_softc        *sc;
+static int
+sysctl_kern_icl_drivers(SYSCTL_HANDLER_ARGS)
+{
+       const struct icl_module *im;
+       struct sbuf sb;
+       int error;
+
+       sbuf_new(&sb, NULL, 256, SBUF_AUTOEXTEND | SBUF_INCLUDENUL);
+
+       sx_slock(&sc->sc_lock);
+       TAILQ_FOREACH(im, &sc->sc_modules, im_next) {
+               if (im != TAILQ_FIRST(&sc->sc_modules))
+                       sbuf_putc(&sb, ' ');
+               sbuf_printf(&sb, "%s", im->im_name);
+       }
+       sx_sunlock(&sc->sc_lock);
+
+       error = sbuf_finish(&sb);
+       if (error == 0)
+               error = SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb));
+       sbuf_delete(&sb);
+       return (error);
+}
 
 static struct icl_module *
 icl_find(const char *name)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to