From 602d2b481a751e59a57d37475766b841e93357d2 Mon Sep 17 00:00:00 2001 From: David Greenman Date: Fri, 23 Dec 1994 04:52:55 +0000 Subject: [PATCH] Protect vnode buffer chain manipulation with splbio to prevent list corruption.. --- sys/kern/vfs_export.c | 9 ++++++++- sys/kern/vfs_subr.c | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index 6713c73af23..b749976c924 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.13 (Berkeley) 4/18/94 - * $Id: vfs_subr.c,v 1.11 1994/10/05 09:48:22 davidg Exp $ + * $Id: vfs_subr.c,v 1.12 1994/10/06 21:06:37 davidg Exp $ */ /* @@ -521,6 +521,7 @@ bgetvp(vp, bp) register struct vnode *vp; register struct buf *bp; { + int s; if (bp->b_vp) panic("bgetvp: not free"); @@ -533,7 +534,9 @@ bgetvp(vp, bp) /* * Insert onto list for new vnode. */ + s = splbio(); bufinsvn(bp, &vp->v_cleanblkhd); + splx(s); } /* @@ -544,14 +547,18 @@ brelvp(bp) register struct buf *bp; { struct vnode *vp; + int s; if (bp->b_vp == (struct vnode *) 0) panic("brelvp: NULL"); /* * Delete from old vnode list, if on one. */ + s = splbio(); if (bp->b_vnbufs.le_next != NOLIST) bufremvn(bp); + splx(s); + vp = bp->b_vp; bp->b_vp = (struct vnode *) 0; HOLDRELE(vp); diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 6713c73af23..b749976c924 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.13 (Berkeley) 4/18/94 - * $Id: vfs_subr.c,v 1.11 1994/10/05 09:48:22 davidg Exp $ + * $Id: vfs_subr.c,v 1.12 1994/10/06 21:06:37 davidg Exp $ */ /* @@ -521,6 +521,7 @@ bgetvp(vp, bp) register struct vnode *vp; register struct buf *bp; { + int s; if (bp->b_vp) panic("bgetvp: not free"); @@ -533,7 +534,9 @@ bgetvp(vp, bp) /* * Insert onto list for new vnode. */ + s = splbio(); bufinsvn(bp, &vp->v_cleanblkhd); + splx(s); } /* @@ -544,14 +547,18 @@ brelvp(bp) register struct buf *bp; { struct vnode *vp; + int s; if (bp->b_vp == (struct vnode *) 0) panic("brelvp: NULL"); /* * Delete from old vnode list, if on one. */ + s = splbio(); if (bp->b_vnbufs.le_next != NOLIST) bufremvn(bp); + splx(s); + vp = bp->b_vp; bp->b_vp = (struct vnode *) 0; HOLDRELE(vp);