summaryrefslogtreecommitdiffstats
path: root/sys/geom/geom_dev.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-04-23 19:54:02 +0000
committerphk <phk@FreeBSD.org>2002-04-23 19:54:02 +0000
commit4ca7562a616825af16d39e04c933c3e66f5a484d (patch)
treed98d149d2c39244eedf2ae44b65577954046c836 /sys/geom/geom_dev.c
parent7bef5a6e99f99634b004f29895f8da28f952e212 (diff)
downloadFreeBSD-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.c18
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;
OpenPOWER on IntegriCloud