Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Jul 2012 22:22:14 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238219 - head/sys/geom/nop
Message-ID:  <201207072222.q67MMEYE093830@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Sat Jul  7 22:22:13 2012
New Revision: 238219
URL: http://svn.freebsd.org/changeset/base/238219

Log:
  Add trivial resize handling to gnop(8).
  
  Reviewed by:	mav
  Sponsored by:	FreeBSD Foundation

Modified:
  head/sys/geom/nop/g_nop.c
  head/sys/geom/nop/g_nop.h

Modified: head/sys/geom/nop/g_nop.c
==============================================================================
--- head/sys/geom/nop/g_nop.c	Sat Jul  7 22:20:47 2012	(r238218)
+++ head/sys/geom/nop/g_nop.c	Sat Jul  7 22:22:13 2012	(r238219)
@@ -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, struc
 	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, struc
 		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, struc
 	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, struc
 	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;
 

Modified: head/sys/geom/nop/g_nop.h
==============================================================================
--- head/sys/geom/nop/g_nop.h	Sat Jul  7 22:20:47 2012	(r238218)
+++ head/sys/geom/nop/g_nop.h	Sat Jul  7 22:22:13 2012	(r238219)
@@ -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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207072222.q67MMEYE093830>