summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2012-07-07 22:22:13 +0000
committertrasz <trasz@FreeBSD.org>2012-07-07 22:22:13 +0000
commitb9655c9adb908d7d26aae414f1d9186c1bae160e (patch)
tree15f82c4e63334cd2af27f3291ac63166ba43cd40 /sys/geom
parent92879956edeb2994a3a88ed9345acc826a8b02dd (diff)
downloadFreeBSD-src-b9655c9adb908d7d26aae414f1d9186c1bae160e.zip
FreeBSD-src-b9655c9adb908d7d26aae414f1d9186c1bae160e.tar.gz
Add trivial resize handling to gnop(8).
Reviewed by: mav Sponsored by: FreeBSD Foundation
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/nop/g_nop.c28
-rw-r--r--sys/geom/nop/g_nop.h1
2 files changed, 29 insertions, 0 deletions
diff --git a/sys/geom/nop/g_nop.c b/sys/geom/nop/g_nop.c
index c28a77f..c43fb2d 100644
--- a/sys/geom/nop/g_nop.c
+++ b/sys/geom/nop/g_nop.c
@@ -72,6 +72,30 @@ g_nop_orphan(struct g_consumer *cp)
}
static void
+g_nop_resize(struct g_consumer *cp)
+{
+ struct g_nop_softc *sc;
+ struct g_geom *gp;
+ struct g_provider *pp;
+ off_t size;
+
+ g_topology_assert();
+
+ gp = cp->geom;
+ sc = gp->softc;
+
+ if (sc->sc_explicitsize != 0)
+ return;
+ if (cp->provider->mediasize < sc->sc_offset) {
+ g_nop_destroy(gp, 1);
+ return;
+ }
+ size = cp->provider->mediasize - sc->sc_offset;
+ LIST_FOREACH(pp, &gp->provider, provider)
+ g_resize_provider(pp, size);
+}
+
+static void
g_nop_start(struct bio *bp)
{
struct g_nop_softc *sc;
@@ -146,6 +170,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
struct g_consumer *cp;
char name[64];
int error;
+ off_t explicitsize;
g_topology_assert();
@@ -165,6 +190,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
gctl_error(req, "Invalid offset for provider %s.", pp->name);
return (EINVAL);
}
+ explicitsize = size;
if (size == 0)
size = pp->mediasize - offset;
if (offset + size > pp->mediasize) {
@@ -192,6 +218,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
gp = g_new_geomf(mp, name);
sc = g_malloc(sizeof(*sc), M_WAITOK);
sc->sc_offset = offset;
+ sc->sc_explicitsize = explicitsize;
sc->sc_error = ioerror;
sc->sc_rfailprob = rfailprob;
sc->sc_wfailprob = wfailprob;
@@ -202,6 +229,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
gp->softc = sc;
gp->start = g_nop_start;
gp->orphan = g_nop_orphan;
+ gp->resize = g_nop_resize;
gp->access = g_nop_access;
gp->dumpconf = g_nop_dumpconf;
diff --git a/sys/geom/nop/g_nop.h b/sys/geom/nop/g_nop.h
index fa66f59..4bfc4e1 100644
--- a/sys/geom/nop/g_nop.h
+++ b/sys/geom/nop/g_nop.h
@@ -57,6 +57,7 @@
struct g_nop_softc {
int sc_error;
off_t sc_offset;
+ off_t sc_explicitsize;
u_int sc_rfailprob;
u_int sc_wfailprob;
uintmax_t sc_reads;
OpenPOWER on IntegriCloud