diff options
author | 2007-12-06 21:49:37 +0000 | |
---|---|---|
committer | 2007-12-06 21:49:37 +0000 | |
commit | e43229a5348323f812c20bac5a283e59fa5b49db (patch) | |
tree | d4bded42d8e3528932d5b5d0a9746e5d482c1796 /sys | |
parent | Remove AD1981HD code, since the generic mixer init can do all of this (diff) | |
download | wireguard-openbsd-e43229a5348323f812c20bac5a283e59fa5b49db.tar.xz wireguard-openbsd-e43229a5348323f812c20bac5a283e59fa5b49db.zip |
solve the biggest problem with concurrent buflist access; makes mfs on
SMP machines reliable. few corner cases remain, which will be
dealt with later; ok deraadt@ millert@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/ufs/mfs/mfs_vfsops.c | 13 | ||||
-rw-r--r-- | sys/ufs/mfs/mfs_vnops.c | 5 |
2 files changed, 14 insertions, 4 deletions
diff --git a/sys/ufs/mfs/mfs_vfsops.c b/sys/ufs/mfs/mfs_vfsops.c index 6264f1a0aef..894534ae7b1 100644 --- a/sys/ufs/mfs/mfs_vfsops.c +++ b/sys/ufs/mfs/mfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mfs_vfsops.c,v 1.37 2007/12/04 19:32:13 otto Exp $ */ +/* $OpenBSD: mfs_vfsops.c,v 1.38 2007/12/06 21:49:37 otto Exp $ */ /* $NetBSD: mfs_vfsops.c,v 1.10 1996/02/09 22:31:28 christos Exp $ */ /* @@ -172,11 +172,18 @@ mfs_start(struct mount *mp, int flags, struct proc *p) struct vnode *vp = VFSTOUFS(mp)->um_devvp; struct mfsnode *mfsp = VTOMFS(vp); struct buf *bp; - int sleepreturn = 0; + int sleepreturn = 0, s; while (mfsp->mfs_buflist != (struct buf *)-1) { - while ((bp = mfsp->mfs_buflist) != NULL) { + while (1) { + s = splbio(); + bp = mfsp->mfs_buflist; + if (bp == NULL) { + splx(s); + break; + } mfsp->mfs_buflist = bp->b_actf; + splx(s); mfs_doio(mfsp, bp); wakeup((caddr_t)bp); } diff --git a/sys/ufs/mfs/mfs_vnops.c b/sys/ufs/mfs/mfs_vnops.c index 1a28d53a378..f9dd66574d3 100644 --- a/sys/ufs/mfs/mfs_vnops.c +++ b/sys/ufs/mfs/mfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mfs_vnops.c,v 1.30 2007/12/04 19:32:13 otto Exp $ */ +/* $OpenBSD: mfs_vnops.c,v 1.31 2007/12/06 21:49:37 otto Exp $ */ /* $NetBSD: mfs_vnops.c,v 1.8 1996/03/17 02:16:32 christos Exp $ */ /* @@ -140,6 +140,7 @@ mfs_strategy(void *v) struct mfsnode *mfsp; struct vnode *vp; struct proc *p = curproc; + int s; if (!vfinddev(bp->b_dev, VBLK, &vp) || vp->v_usecount == 0) panic("mfs_strategy: bad dev"); @@ -148,8 +149,10 @@ mfs_strategy(void *v) if (p != NULL && mfsp->mfs_pid == p->p_pid) { mfs_doio(mfsp, bp); } else { + s = splbio(); bp->b_actf = mfsp->mfs_buflist; mfsp->mfs_buflist = bp; + splx(s); wakeup((caddr_t)vp); } return (0); |