Date: Thu, 12 Feb 2004 23:52:50 +0100 From: Poul-Henning Kamp <phk@phk.freebsd.dk> To: geom@freebsd.org Subject: PATCH: never fail close requests Message-ID: <29862.1076626370@critter.freebsd.dk>
next in thread | raw e-mail | index | archive | help
This patch adds a KASSERT in geom_subr.c which explodes if an access method returns an error to a request which have no positive access counts. In other words: it is _always_ legal to close and there is no need to check the error return for a g_access() call which has no positive counts for read, write or exclusive. I'll commit this in a couple of days, but wanted to give you guys a heads-up first so we can see if anything explodes on this. Thanks to Pawel for finding a few places where this was a problem. Poul-Henning Index: geom/geom_bsd.c =================================================================== RCS file: /home/ncvs/src/sys/geom/geom_bsd.c,v retrieving revision 1.67 diff -u -r1.67 geom_bsd.c --- geom/geom_bsd.c 12 Feb 2004 22:42:11 -0000 1.67 +++ geom/geom_bsd.c 12 Feb 2004 22:46:40 -0000 @@ -569,7 +569,7 @@ } while (0); /* Success or failure, we can close our provider now. */ - error = g_access(cp, -1, 0, 0); + g_access(cp, -1, 0, 0); /* If we have configured any providers, return the new geom. */ if (gsp->nprovider > 0) { Index: geom/geom_fox.c =================================================================== RCS file: /home/ncvs/src/sys/geom/geom_fox.c,v retrieving revision 1.5 diff -u -r1.5 geom_fox.c --- geom/geom_fox.c 12 Feb 2004 22:42:11 -0000 1.5 +++ geom/geom_fox.c 12 Feb 2004 22:47:54 -0000 @@ -90,8 +90,7 @@ cp1 = LIST_NEXT(sc->opath, consumer); - error = g_access(sc->opath, -sc->cr, -sc->cw, -(sc->ce + 1)); - KASSERT(error == 0, ("Failed close of old path %d", error)); + g_access(sc->opath, -sc->cr, -sc->cw, -(sc->ce + 1)); /* * The attempt to reopen it with a exclusive count Index: geom/geom_subr.c =================================================================== RCS file: /home/ncvs/src/sys/geom/geom_subr.c,v retrieving revision 1.70 diff -u -r1.70 geom_subr.c --- geom/geom_subr.c 12 Feb 2004 22:42:11 -0000 1.70 +++ geom/geom_subr.c 12 Feb 2004 22:49:41 -0000 @@ -627,6 +627,9 @@ /* Ok then... */ error = pp->geom->access(pp, dcr, dcw, dce); + KASSERT(dcr > 0 || dcw > 0 || dce > 0 || error == 0, + ("Geom provider %s::%s failed closeing ->access()", + pp->geom->class->name, pp->name)); if (!error) { /* * If we open first write, spoil any partner consumers. Index: geom/bde/g_bde.c =================================================================== RCS file: /home/ncvs/src/sys/geom/bde/g_bde.c,v retrieving revision 1.25 diff -u -r1.25 g_bde.c --- geom/bde/g_bde.c 12 Feb 2004 22:42:11 -0000 1.25 +++ geom/bde/g_bde.c 12 Feb 2004 22:49:15 -0000 @@ -226,7 +226,6 @@ { struct g_consumer *cp; struct g_provider *pp; - int error; struct g_bde_softc *sc; g_trace(G_T_TOPOLOGY, "g_bde_destroy_geom(%s, %s)", mp->name, gp->name); @@ -244,8 +243,7 @@ KASSERT(cp != NULL, ("NULL consumer")); sc->dead = 1; wakeup(sc); - error = g_access(cp, -1, -1, -1); - KASSERT(error == 0, ("error on close")); + g_access(cp, -1, -1, -1); g_detach(cp); g_destroy_consumer(cp); while (sc->dead != 2 && !LIST_EMPTY(&pp->consumers)) -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk@FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?29862.1076626370>