Module Name: src Committed By: bouyer Date: Sat Jan 23 18:31:04 UTC 2010
Modified Files: src/sys/dev: cgd.c vnd.c src/sys/dev/dkwedge: dk.c Log Message: struct buf::b_iodone is not called at splbio() any more. Make sure non-MPsafe iodone callbacks raise the SPL as appropriate. Fix buffer corruption issue I noticed in dk(4), and probable similar issues in vnd(4) and cgd(4). To generate a diff of this commit: cvs rdiff -u -r1.68 -r1.69 src/sys/dev/cgd.c cvs rdiff -u -r1.205 -r1.206 src/sys/dev/vnd.c cvs rdiff -u -r1.52 -r1.53 src/sys/dev/dkwedge/dk.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/cgd.c diff -u src/sys/dev/cgd.c:1.68 src/sys/dev/cgd.c:1.69 --- src/sys/dev/cgd.c:1.68 Wed Jan 20 19:00:47 2010 +++ src/sys/dev/cgd.c Sat Jan 23 18:31:04 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: cgd.c,v 1.68 2010/01/20 19:00:47 dyoung Exp $ */ +/* $NetBSD: cgd.c,v 1.69 2010/01/23 18:31:04 bouyer Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.68 2010/01/20 19:00:47 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.69 2010/01/23 18:31:04 bouyer Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -411,13 +411,13 @@ return 0; } -/* expected to be called at splbio() */ static void cgdiodone(struct buf *nbp) { struct buf *obp = nbp->b_private; struct cgd_softc *cs = getcgd_softc(obp->b_dev); struct dk_softc *dksc = &cs->sc_dksc; + int s; KDASSERT(cs); @@ -453,10 +453,12 @@ obp->b_resid = 0; if (obp->b_error != 0) obp->b_resid = obp->b_bcount; + s = splbio(); disk_unbusy(&dksc->sc_dkdev, obp->b_bcount - obp->b_resid, (obp->b_flags & B_READ)); biodone(obp); dk_iodone(di, dksc); + splx(s); } /* XXX: we should probably put these into dksubr.c, mostly */ Index: src/sys/dev/vnd.c diff -u src/sys/dev/vnd.c:1.205 src/sys/dev/vnd.c:1.206 --- src/sys/dev/vnd.c:1.205 Sun Dec 6 16:33:18 2009 +++ src/sys/dev/vnd.c Sat Jan 23 18:31:04 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vnd.c,v 1.205 2009/12/06 16:33:18 dsl Exp $ */ +/* $NetBSD: vnd.c,v 1.206 2010/01/23 18:31:04 bouyer Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc. @@ -130,7 +130,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.205 2009/12/06 16:33:18 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.206 2010/01/23 18:31:04 bouyer Exp $"); #if defined(_KERNEL_OPT) #include "fs_nfs.h" @@ -874,6 +874,7 @@ struct vndxfer *vnx = VND_BUFTOXFER(bp); struct vnd_softc *vnd = vnx->vx_vnd; struct buf *obp = bp->b_private; + int s = splbio(); KASSERT(&vnx->vx_buf == bp); KASSERT(vnd->sc_active > 0); @@ -889,6 +890,7 @@ if (vnd->sc_active == 0) { wakeup(&vnd->sc_tab); } + splx(s); obp->b_error = bp->b_error; obp->b_resid = bp->b_resid; buf_destroy(bp); Index: src/sys/dev/dkwedge/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.52 src/sys/dev/dkwedge/dk.c:1.53 --- src/sys/dev/dkwedge/dk.c:1.52 Sun Dec 27 01:37:17 2009 +++ src/sys/dev/dkwedge/dk.c Sat Jan 23 18:31:04 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.52 2009/12/27 01:37:17 jakllsch Exp $ */ +/* $NetBSD: dk.c,v 1.53 2010/01/23 18:31:04 bouyer Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.52 2009/12/27 01:37:17 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.53 2010/01/23 18:31:04 bouyer Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1198,7 +1198,6 @@ * dkiodone: * * I/O to a wedge has completed; alert the top half. - * NOTE: Must be called at splbio()! */ static void dkiodone(struct buf *bp) @@ -1206,6 +1205,8 @@ struct buf *obp = bp->b_private; struct dkwedge_softc *sc = dkwedge_lookup(obp->b_dev); + int s = splbio(); + if (bp->b_error != 0) obp->b_error = bp->b_error; obp->b_resid = bp->b_resid; @@ -1223,6 +1224,7 @@ /* Kick the queue in case there is more work we can do. */ dkstart(sc); + splx(s); } /*