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_bsd.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_bsd.c')
-rw-r--r-- | sys/geom/geom_bsd.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/sys/geom/geom_bsd.c b/sys/geom/geom_bsd.c index 419998a..22d56b9 100644 --- a/sys/geom/geom_bsd.c +++ b/sys/geom/geom_bsd.c @@ -60,6 +60,7 @@ #define BSD_CLASS_NAME "BSD-class" struct g_bsd_softc { + off_t labeloffset; struct disklabel ondisk; struct disklabel inram; }; @@ -226,11 +227,13 @@ g_bsd_lesum(struct disklabel *dl, u_char *p) } static int -g_bsd_i386(struct g_slicer *gsp, struct g_consumer *cp, int secsize, struct disklabel *dl) +g_bsd_i386(struct g_slicer *gsp, struct g_consumer *cp, int secsize, struct g_bsd_softc *ms) { int error; u_char *buf; + struct disklabel *dl; + dl = &ms->ondisk; buf = g_read_data(cp, secsize * 1, secsize, &error); if (buf == NULL || error != 0) return(ENOENT); @@ -242,16 +245,21 @@ g_bsd_i386(struct g_slicer *gsp, struct g_consumer *cp, int secsize, struct disk else error = ENOENT; g_free(buf); - gsp->frontstuff = 16 * secsize; + if (error == 0) { + gsp->frontstuff = 16 * secsize; + ms->labeloffset = secsize * 1; + } return(error); } static int -g_bsd_alpha(struct g_slicer *gsp, struct g_consumer *cp, int secsize, struct disklabel *dl) +g_bsd_alpha(struct g_slicer *gsp, struct g_consumer *cp, int secsize, struct g_bsd_softc *ms) { int error; u_char *buf; + struct disklabel *dl; + dl = &ms->ondisk; buf = g_read_data(cp, 0, secsize, &error); if (buf == NULL || error != 0) return(ENOENT); @@ -263,7 +271,10 @@ g_bsd_alpha(struct g_slicer *gsp, struct g_consumer *cp, int secsize, struct dis else error = ENOENT; g_free(buf); - gsp->frontstuff = 16 * secsize; + if (error == 0) { + gsp->frontstuff = 16 * secsize; + ms->labeloffset = 64; + } return(error); } @@ -295,17 +306,15 @@ g_bsd_start(struct bio *bp) static void g_bsd_dumpconf(struct sbuf *sb, char *indent, struct g_geom *gp, struct g_consumer *cp __unused, struct g_provider *pp) { -#if 0 - struct g_mbr_softc *ms; + struct g_bsd_softc *ms; struct g_slicer *gsp; gsp = gp->softc; ms = gsp->softc; - if (pp != NULL) { - sbuf_printf(sb, "%s<type>%d</type>\n", - indent, ms->type[pp->index]); + if (pp == NULL && cp == NULL) { + sbuf_printf(sb, "%s<labeloffset>%lld</labeloffset>\n", + indent, ms->labeloffset); } -#endif g_slice_dumpconf(sb, indent, gp, cp, pp); } @@ -352,9 +361,9 @@ g_bsd_taste(struct g_class *mp, struct g_provider *pp, int flags) printf("g_error %d Mediasize is %lld bytes\n", error, (long long)mediasize); } - error = g_bsd_i386(gsp, cp, secsize, &ms->ondisk); + error = g_bsd_i386(gsp, cp, secsize, ms); if (error) - error = g_bsd_alpha(gsp, cp, secsize, &ms->ondisk); + error = g_bsd_alpha(gsp, cp, secsize, ms); if (error) break; dl = &ms->ondisk; |