Changeset View
Changeset View
Standalone View
Standalone View
head/sys/geom/nop/g_nop.c
Show First 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | case BIO_READ: | ||||
sc->sc_readbytes += bp->bio_length; | sc->sc_readbytes += bp->bio_length; | ||||
failprob = sc->sc_rfailprob; | failprob = sc->sc_rfailprob; | ||||
break; | break; | ||||
case BIO_WRITE: | case BIO_WRITE: | ||||
sc->sc_writes++; | sc->sc_writes++; | ||||
sc->sc_wrotebytes += bp->bio_length; | sc->sc_wrotebytes += bp->bio_length; | ||||
failprob = sc->sc_wfailprob; | failprob = sc->sc_wfailprob; | ||||
break; | break; | ||||
case BIO_DELETE: | |||||
sc->sc_deletes++; | |||||
break; | |||||
case BIO_GETATTR: | |||||
sc->sc_getattrs++; | |||||
break; | |||||
case BIO_FLUSH: | |||||
sc->sc_flushes++; | |||||
break; | |||||
case BIO_CMD0: | |||||
sc->sc_cmd0s++; | |||||
break; | |||||
case BIO_CMD1: | |||||
sc->sc_cmd1s++; | |||||
break; | |||||
case BIO_CMD2: | |||||
sc->sc_cmd2s++; | |||||
break; | |||||
} | } | ||||
mtx_unlock(&sc->sc_lock); | mtx_unlock(&sc->sc_lock); | ||||
if (failprob > 0) { | if (failprob > 0) { | ||||
u_int rval; | u_int rval; | ||||
rval = arc4random() % 100; | rval = arc4random() % 100; | ||||
if (rval < failprob) { | if (rval < failprob) { | ||||
G_NOP_LOGREQLVL(1, bp, "Returning error=%d.", sc->sc_error); | G_NOP_LOGREQLVL(1, bp, "Returning error=%d.", sc->sc_error); | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp, | ||||
sc->sc_explicitsize = explicitsize; | sc->sc_explicitsize = explicitsize; | ||||
sc->sc_stripesize = stripesize; | sc->sc_stripesize = stripesize; | ||||
sc->sc_stripeoffset = stripeoffset; | sc->sc_stripeoffset = stripeoffset; | ||||
sc->sc_error = ioerror; | sc->sc_error = ioerror; | ||||
sc->sc_rfailprob = rfailprob; | sc->sc_rfailprob = rfailprob; | ||||
sc->sc_wfailprob = wfailprob; | sc->sc_wfailprob = wfailprob; | ||||
sc->sc_reads = 0; | sc->sc_reads = 0; | ||||
sc->sc_writes = 0; | sc->sc_writes = 0; | ||||
sc->sc_deletes = 0; | |||||
sc->sc_getattrs = 0; | |||||
sc->sc_flushes = 0; | |||||
sc->sc_cmd0s = 0; | |||||
sc->sc_cmd1s = 0; | |||||
sc->sc_cmd2s = 0; | |||||
sc->sc_readbytes = 0; | sc->sc_readbytes = 0; | ||||
sc->sc_wrotebytes = 0; | sc->sc_wrotebytes = 0; | ||||
mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF); | mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF); | ||||
gp->softc = sc; | gp->softc = sc; | ||||
gp->start = g_nop_start; | gp->start = g_nop_start; | ||||
gp->orphan = g_nop_orphan; | gp->orphan = g_nop_orphan; | ||||
gp->resize = g_nop_resize; | gp->resize = g_nop_resize; | ||||
gp->access = g_nop_access; | gp->access = g_nop_access; | ||||
▲ Show 20 Lines • Show All 348 Lines • ▼ Show 20 Lines | for (i = 0; i < *nargs; i++) { | ||||
if (pp == NULL || pp->geom->class != mp) { | if (pp == NULL || pp->geom->class != mp) { | ||||
G_NOP_DEBUG(1, "Provider %s is invalid.", name); | G_NOP_DEBUG(1, "Provider %s is invalid.", name); | ||||
gctl_error(req, "Provider %s is invalid.", name); | gctl_error(req, "Provider %s is invalid.", name); | ||||
return; | return; | ||||
} | } | ||||
sc = pp->geom->softc; | sc = pp->geom->softc; | ||||
sc->sc_reads = 0; | sc->sc_reads = 0; | ||||
sc->sc_writes = 0; | sc->sc_writes = 0; | ||||
sc->sc_deletes = 0; | |||||
sc->sc_getattrs = 0; | |||||
sc->sc_flushes = 0; | |||||
sc->sc_cmd0s = 0; | |||||
sc->sc_cmd1s = 0; | |||||
sc->sc_cmd2s = 0; | |||||
sc->sc_readbytes = 0; | sc->sc_readbytes = 0; | ||||
sc->sc_wrotebytes = 0; | sc->sc_wrotebytes = 0; | ||||
} | } | ||||
} | } | ||||
static void | static void | ||||
g_nop_config(struct gctl_req *req, struct g_class *mp, const char *verb) | g_nop_config(struct gctl_req *req, struct g_class *mp, const char *verb) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | sbuf_printf(sb, "%s<Offset>%jd</Offset>\n", indent, | ||||
(intmax_t)sc->sc_offset); | (intmax_t)sc->sc_offset); | ||||
sbuf_printf(sb, "%s<ReadFailProb>%u</ReadFailProb>\n", indent, | sbuf_printf(sb, "%s<ReadFailProb>%u</ReadFailProb>\n", indent, | ||||
sc->sc_rfailprob); | sc->sc_rfailprob); | ||||
sbuf_printf(sb, "%s<WriteFailProb>%u</WriteFailProb>\n", indent, | sbuf_printf(sb, "%s<WriteFailProb>%u</WriteFailProb>\n", indent, | ||||
sc->sc_wfailprob); | sc->sc_wfailprob); | ||||
sbuf_printf(sb, "%s<Error>%d</Error>\n", indent, sc->sc_error); | sbuf_printf(sb, "%s<Error>%d</Error>\n", indent, sc->sc_error); | ||||
sbuf_printf(sb, "%s<Reads>%ju</Reads>\n", indent, sc->sc_reads); | sbuf_printf(sb, "%s<Reads>%ju</Reads>\n", indent, sc->sc_reads); | ||||
sbuf_printf(sb, "%s<Writes>%ju</Writes>\n", indent, sc->sc_writes); | sbuf_printf(sb, "%s<Writes>%ju</Writes>\n", indent, sc->sc_writes); | ||||
sbuf_printf(sb, "%s<Deletes>%ju</Deletes>\n", indent, sc->sc_deletes); | |||||
sbuf_printf(sb, "%s<Getattrs>%ju</Getattrs>\n", indent, sc->sc_getattrs); | |||||
sbuf_printf(sb, "%s<Flushes>%ju</Flushes>\n", indent, sc->sc_flushes); | |||||
sbuf_printf(sb, "%s<Cmd0s>%ju</Cmd0s>\n", indent, sc->sc_cmd0s); | |||||
sbuf_printf(sb, "%s<Cmd1s>%ju</Cmd1s>\n", indent, sc->sc_cmd1s); | |||||
sbuf_printf(sb, "%s<Cmd2s>%ju</Cmd2s>\n", indent, sc->sc_cmd2s); | |||||
sbuf_printf(sb, "%s<ReadBytes>%ju</ReadBytes>\n", indent, | sbuf_printf(sb, "%s<ReadBytes>%ju</ReadBytes>\n", indent, | ||||
sc->sc_readbytes); | sc->sc_readbytes); | ||||
sbuf_printf(sb, "%s<WroteBytes>%ju</WroteBytes>\n", indent, | sbuf_printf(sb, "%s<WroteBytes>%ju</WroteBytes>\n", indent, | ||||
sc->sc_wrotebytes); | sc->sc_wrotebytes); | ||||
} | } | ||||
DECLARE_GEOM_CLASS(g_nop_class, g_nop); | DECLARE_GEOM_CLASS(g_nop_class, g_nop); |