diff options
author | phk <phk@FreeBSD.org> | 2002-04-23 19:54:02 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2002-04-23 19:54:02 +0000 |
commit | 4ca7562a616825af16d39e04c933c3e66f5a484d (patch) | |
tree | d98d149d2c39244eedf2ae44b65577954046c836 /sys/geom/geom_dev.c | |
parent | 7bef5a6e99f99634b004f29895f8da28f952e212 (diff) | |
download | FreeBSD-src-4ca7562a616825af16d39e04c933c3e66f5a484d.zip FreeBSD-src-4ca7562a616825af16d39e04c933c3e66f5a484d.tar.gz |
Implement the GEOMGETCONF ioctl which returns vital stats for the
current device in XML in an sbuf.
Sponsored by: DARPA & NAI Labs
Diffstat (limited to 'sys/geom/geom_dev.c')
-rw-r--r-- | sys/geom/geom_dev.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index b845b06..d74113b 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -48,6 +48,7 @@ #include <sys/disk.h> #include <sys/fcntl.h> #include <geom/geom.h> +#include <geom/geom_int.h> #include <machine/limits.h> #define CDEV_MAJOR 4 @@ -238,15 +239,19 @@ g_dev_close(dev_t dev, int flags, int fmt, struct thread *td) static int g_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td) { - struct g_geom *gp; + struct g_geom *gp, *gp2; struct g_consumer *cp; + struct g_provider *pp2; struct g_kerneldump kd; int i, error; u_int u; struct g_ioctl *gio; + struct sbuf *usb, *sb; gp = dev->si_drv1; cp = dev->si_drv2; + pp2 = cp->provider; + gp2 = pp2->geom; error = 0; DROP_GIANT(); @@ -282,6 +287,17 @@ g_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td) if (!error) dev->si_flags |= SI_DUMPDEV; break; + case GEOMGETCONF: + /* we bogusly pass cp to avoid getting any consumers listed */ + sb = g_conf_specific(gp2->class, gp2, pp2, cp); + usb = (struct sbuf *)data; + if (usb->s_size - 1 < sbuf_len(sb)) + error = ENOMEM; + else + error = copyout(sbuf_data(sb), usb->s_buf, sbuf_len(sb) + 1); + if (!error) + usb->s_len = sbuf_len(sb); + break; default: gio = g_malloc(sizeof *gio, M_WAITOK); gio->cmd = cmd; |