Expose stripe offset and stripe size through libgeom and geom(8) userland

utilities.

Reviewed by:	pjd, mav (earlier version)
This commit is contained in:
Xin LI 2010-01-17 06:20:30 +00:00
parent f212a61d5f
commit 35daa28f30
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=202454
6 changed files with 67 additions and 1 deletions

View File

@ -113,6 +113,32 @@ g_sectorsize(int fd)
return ((ssize_t)sectorsize);
}
/*
* 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.
*/

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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) {

View File

@ -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) {