diff options
author | delphij <delphij@FreeBSD.org> | 2010-01-17 06:20:30 +0000 |
---|---|---|
committer | delphij <delphij@FreeBSD.org> | 2010-01-17 06:20:30 +0000 |
commit | 16c4a5ec2099b564a3372fead91070ad8816723a (patch) | |
tree | eddbf7d4c94dd7c16658d16b0e3f9612ebc27ff9 | |
parent | 7cef302ab8816e0aac85ec3070022921b840af26 (diff) | |
download | FreeBSD-src-16c4a5ec2099b564a3372fead91070ad8816723a.zip FreeBSD-src-16c4a5ec2099b564a3372fead91070ad8816723a.tar.gz |
Expose stripe offset and stripe size through libgeom and geom(8) userland
utilities.
Reviewed by: pjd, mav (earlier version)
-rw-r--r-- | lib/libgeom/geom_util.c | 26 | ||||
-rw-r--r-- | lib/libgeom/geom_xml2tree.c | 10 | ||||
-rw-r--r-- | lib/libgeom/libgeom.3 | 16 | ||||
-rw-r--r-- | lib/libgeom/libgeom.h | 4 | ||||
-rw-r--r-- | sbin/geom/core/geom.c | 8 | ||||
-rw-r--r-- | sys/geom/geom_dump.c | 4 |
6 files changed, 67 insertions, 1 deletions
diff --git a/lib/libgeom/geom_util.c b/lib/libgeom/geom_util.c index 539b6c6..54844c6 100644 --- a/lib/libgeom/geom_util.c +++ b/lib/libgeom/geom_util.c @@ -114,6 +114,32 @@ g_sectorsize(int fd) } /* + * Return stripe size of the given provider. + */ +off_t +g_stripesize(int fd) +{ + off_t stripesize; + + if (g_ioctl_arg(fd, DIOCGSTRIPESIZE, &stripesize) == -1) + return (-1); + return (stripesize); +} + +/* + * Return stripe size of the given provider. + */ +off_t +g_stripeoffset(int fd) +{ + off_t stripeoffset; + + if (g_ioctl_arg(fd, DIOCGSTRIPEOFFSET, &stripeoffset) == -1) + return (-1); + return (stripeoffset); +} + +/* * Return the correct provider name. */ char * diff --git a/lib/libgeom/geom_xml2tree.c b/lib/libgeom/geom_xml2tree.c index 1c7e22b..821449b 100644 --- a/lib/libgeom/geom_xml2tree.c +++ b/lib/libgeom/geom_xml2tree.c @@ -230,6 +230,16 @@ EndElement(void *userData, const char *name) free(p); return; } + if (!strcmp(name, "stripesize") && mt->provider != NULL) { + mt->provider->lg_stripesize = strtoumax(p, NULL, 0); + free(p); + return; + } + if (!strcmp(name, "stripeoffset") && mt->provider != NULL) { + mt->provider->lg_stripeoffset = strtoumax(p, NULL, 0); + free(p); + return; + } if (!strcmp(name, "config")) { mt->config = NULL; diff --git a/lib/libgeom/libgeom.3 b/lib/libgeom/libgeom.3 index 9272d3b..3c15805 100644 --- a/lib/libgeom/libgeom.3 +++ b/lib/libgeom/libgeom.3 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 8, 2008 +.Dd January 16, 2010 .Dt LIBGEOM 3 .Os .Sh NAME @@ -50,6 +50,8 @@ .Nm g_close , .Nm g_mediasize , .Nm g_sectorsize , +.Nm g_stripeoffset , +.Nm g_stripesize , .Nm g_flush , .Nm g_delete , .Nm g_device_path , @@ -101,6 +103,10 @@ .Fn g_mediasize "int fd" .Ft ssize_t .Fn g_sectorsize "int fd" +.Ft ssize_t +.Fn g_stripeoffset "int fd" +.Ft ssize_t +.Fn g_stripesize "int fd" .Ft int .Fn g_flush "int fd" .Ft int @@ -297,6 +303,14 @@ The function returns sector size of the given provider. .Pp The +.Fn g_stripeoffset +function returns stripe size of the given provider. +.Pp +The +.Fn g_stripesize +function returns stripe size of the given provider. +.Pp +The .Fn g_flush function sends .Dv BIO_FLUSH diff --git a/lib/libgeom/libgeom.h b/lib/libgeom/libgeom.h index 7255bd4..c951f25 100644 --- a/lib/libgeom/libgeom.h +++ b/lib/libgeom/libgeom.h @@ -123,6 +123,8 @@ struct gprovider { char *lg_mode; off_t lg_mediasize; u_int lg_sectorsize; + off_t lg_stripeoffset; + off_t lg_stripesize; struct gconf lg_config; }; @@ -149,6 +151,8 @@ int g_open(const char *, int); int g_close(int); off_t g_mediasize(int); ssize_t g_sectorsize(int); +off_t g_stripeoffset(int); +off_t g_stripesize(int); int g_flush(int); int g_delete(int, off_t, off_t); int g_get_ident(int, char *, size_t); diff --git a/sbin/geom/core/geom.c b/sbin/geom/core/geom.c index 7f2a281..c364d92 100644 --- a/sbin/geom/core/geom.c +++ b/sbin/geom/core/geom.c @@ -772,6 +772,10 @@ list_one_provider(struct gprovider *pp, const char *prefix) printf("%sMediasize: %jd (%s)\n", prefix, (intmax_t)pp->lg_mediasize, buf); printf("%sSectorsize: %u\n", prefix, pp->lg_sectorsize); + if (pp->lg_stripesize > 0) { + printf("%sStripesize: %ju\n", prefix, pp->lg_stripesize); + printf("%sStripeoffset: %ju\n", prefix, pp->lg_stripeoffset); + } printf("%sMode: %s\n", prefix, pp->lg_mode); LIST_FOREACH(conf, &pp->lg_config, lg_config) { printf("%s%s: %s\n", prefix, conf->lg_name, conf->lg_val); @@ -796,6 +800,10 @@ list_one_consumer(struct gconsumer *cp, const char *prefix) printf("%sMediasize: %jd (%s)\n", prefix, (intmax_t)pp->lg_mediasize, buf); printf("%sSectorsize: %u\n", prefix, pp->lg_sectorsize); + if (pp->lg_stripesize > 0) { + printf("%sStripesize: %ju\n", prefix, pp->lg_stripesize); + printf("%sStripeoffset: %ju\n", prefix, pp->lg_stripeoffset); + } printf("%sMode: %s\n", prefix, cp->lg_mode); } LIST_FOREACH(conf, &cp->lg_config, lg_config) { diff --git a/sys/geom/geom_dump.c b/sys/geom/geom_dump.c index 1f00db9..c804bab 100644 --- a/sys/geom/geom_dump.c +++ b/sys/geom/geom_dump.c @@ -185,6 +185,10 @@ g_conf_provider(struct sbuf *sb, struct g_provider *pp) sbuf_printf(sb, "\t <mediasize>%jd</mediasize>\n", (intmax_t)pp->mediasize); sbuf_printf(sb, "\t <sectorsize>%u</sectorsize>\n", pp->sectorsize); + if (pp->stripesize > 0) { + sbuf_printf(sb, "\t <stripesize>%u</stripesize>\n", pp->stripesize); + sbuf_printf(sb, "\t <stripeoffset>%u</stripeoffset>\n", pp->stripeoffset); + } if (pp->geom->flags & G_GEOM_WITHER) ; else if (pp->geom->dumpconf != NULL) { |