Page MenuHomeFreeBSD

D3664.id8756.diff
No OneTemporary

D3664.id8756.diff

Index: sbin/geom/class/nop/geom_nop.c
===================================================================
--- sbin/geom/class/nop/geom_nop.c
+++ sbin/geom/class/nop/geom_nop.c
@@ -43,14 +43,16 @@
{
{ 'e', "error", "-1", G_TYPE_NUMBER },
{ 'o', "offset", "0", G_TYPE_NUMBER },
+ { 'p', "stripesize", "0", G_TYPE_NUMBER },
+ { 'P', "stripeoffset", "0", G_TYPE_NUMBER },
{ 'r', "rfailprob", "-1", G_TYPE_NUMBER },
{ 's', "size", "0", G_TYPE_NUMBER },
{ 'S', "secsize", "0", G_TYPE_NUMBER },
{ 'w', "wfailprob", "-1", G_TYPE_NUMBER },
G_OPT_SENTINEL
},
- "[-v] [-e error] [-o offset] [-r rfailprob] [-s size] "
- "[-S secsize] [-w wfailprob] dev ..."
+ "[-v] [-e error] [-o offset] [-p stripesize] [-P stripeoffset] "
+ "[-r rfailprob] [-s size] [-S secsize] [-w wfailprob] dev ..."
},
{ "configure", G_FLAG_VERBOSE, NULL,
{
Index: sbin/geom/class/nop/gnop.8
===================================================================
--- sbin/geom/class/nop/gnop.8
+++ sbin/geom/class/nop/gnop.8
@@ -36,6 +36,8 @@
.Op Fl v
.Op Fl e Ar error
.Op Fl o Ar offset
+.Op Fl p Ar stripesize
+.Op Fl P Ar stripeoffset
.Op Fl r Ar rfailprob
.Op Fl s Ar size
.Op Fl S Ar secsize
@@ -115,6 +117,10 @@
Force the removal of the specified provider.
.It Fl o Ar offset
Where to begin on the original provider.
+.It Fl p Ar stripesize
+Value of the stripesize property of the transparent provider.
+.It Fl P Ar stripeoffset
+Value of the stripeoffset property of the transparent provider.
.It Fl r Ar rfailprob
Specifies read failure probability in percent.
.It Fl s Ar size
Index: sys/geom/nop/g_nop.h
===================================================================
--- sys/geom/nop/g_nop.h
+++ sys/geom/nop/g_nop.h
@@ -59,6 +59,8 @@
int sc_error;
off_t sc_offset;
off_t sc_explicitsize;
+ off_t sc_stripesize;
+ off_t sc_stripeoffset;
u_int sc_rfailprob;
u_int sc_wfailprob;
uintmax_t sc_reads;
Index: sys/geom/nop/g_nop.c
===================================================================
--- sys/geom/nop/g_nop.c
+++ sys/geom/nop/g_nop.c
@@ -162,7 +162,7 @@
static int
g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
int ioerror, u_int rfailprob, u_int wfailprob, off_t offset, off_t size,
- u_int secsize)
+ u_int secsize, u_int stripesize, u_int stripeoffset)
{
struct g_nop_softc *sc;
struct g_geom *gp;
@@ -208,6 +208,18 @@
return (EINVAL);
}
size -= size % secsize;
+ if ((stripesize % pp->sectorsize) != 0) {
+ gctl_error(req, "Invalid stripesize for provider %s.", pp->name);
+ return (EINVAL);
+ }
+ if ((stripeoffset % pp->sectorsize) != 0) {
+ gctl_error(req, "Invalid stripeoffset for provider %s.", pp->name);
+ return (EINVAL);
+ }
+ if (stripesize != 0 && stripeoffset >= stripesize) {
+ gctl_error(req, "stripeoffset is too big.");
+ return (EINVAL);
+ }
snprintf(name, sizeof(name), "%s%s", pp->name, G_NOP_SUFFIX);
LIST_FOREACH(gp, &mp->geom, geom) {
if (strcmp(gp->name, name) == 0) {
@@ -219,6 +231,8 @@
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
sc->sc_offset = offset;
sc->sc_explicitsize = explicitsize;
+ sc->sc_stripesize = stripesize;
+ sc->sc_stripeoffset = stripeoffset;
sc->sc_error = ioerror;
sc->sc_rfailprob = rfailprob;
sc->sc_wfailprob = wfailprob;
@@ -238,6 +252,8 @@
newpp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE;
newpp->mediasize = size;
newpp->sectorsize = secsize;
+ newpp->stripesize = stripesize;
+ newpp->stripeoffset = stripeoffset;
cp = g_new_consumer(gp);
cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE;
@@ -304,7 +320,8 @@
g_nop_ctl_create(struct gctl_req *req, struct g_class *mp)
{
struct g_provider *pp;
- intmax_t *error, *rfailprob, *wfailprob, *offset, *secsize, *size;
+ intmax_t *error, *rfailprob, *wfailprob, *offset, *secsize, *size,
+ *stripesize, *stripeoffset;
const char *name;
char param[16];
int i, *nargs;
@@ -370,6 +387,24 @@
gctl_error(req, "Invalid '%s' argument", "secsize");
return;
}
+ stripesize = gctl_get_paraml(req, "stripesize", sizeof(*stripesize));
+ if (stripesize == NULL) {
+ gctl_error(req, "No '%s' argument", "stripesize");
+ return;
+ }
+ if (*stripesize < 0) {
+ gctl_error(req, "Invalid '%s' argument", "stripesize");
+ return;
+ }
+ stripeoffset = gctl_get_paraml(req, "stripeoffset", sizeof(*stripeoffset));
+ if (stripeoffset == NULL) {
+ gctl_error(req, "No '%s' argument", "stripeoffset");
+ return;
+ }
+ if (*stripeoffset < 0) {
+ gctl_error(req, "Invalid '%s' argument", "stripeoffset");
+ return;
+ }
for (i = 0; i < *nargs; i++) {
snprintf(param, sizeof(param), "arg%d", i);
@@ -390,7 +425,8 @@
*error == -1 ? EIO : (int)*error,
*rfailprob == -1 ? 0 : (u_int)*rfailprob,
*wfailprob == -1 ? 0 : (u_int)*wfailprob,
- (off_t)*offset, (off_t)*size, (u_int)*secsize) != 0) {
+ (off_t)*offset, (off_t)*size, (u_int)*secsize,
+ (u_int)*stripesize, (u_int)*stripeoffset) != 0) {
return;
}
}

File Metadata

Mime Type
text/plain
Expires
Wed, Jun 10, 9:52 AM (9 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33847569
Default Alt Text
D3664.id8756.diff (4 KB)

Event Timeline