summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2008-02-24 16:38:58 +0000
committerattilio <attilio@FreeBSD.org>2008-02-24 16:38:58 +0000
commit0d54671a48443b15ac601a80e192bc4c8faed7f9 (patch)
tree997840c8acf28b15394b97f1d05d64f78bf81fd6 /sys/ufs/ffs
parent1c8346475e6e9a892928e5197425bb703eba2930 (diff)
downloadFreeBSD-src-0d54671a48443b15ac601a80e192bc4c8faed7f9.zip
FreeBSD-src-0d54671a48443b15ac601a80e192bc4c8faed7f9.tar.gz
Introduce some functions in the vnode locks namespace and in the ffs
namespace in order to handle lockmgr fields in a controlled way instead than spreading all around bogus stubs: - VN_LOCK_AREC() allows lock recursion for a specified vnode - VN_LOCK_ASHARE() allows lock sharing for a specified vnode In FFS land: - BUF_AREC() allows lock recursion for a specified buffer lock - BUF_NOREC() disallows recursion for a specified buffer lock Side note: union_subr.c::unionfs_node_update() is the only other function directly handling lockmgr fields. As this is not simple to fix, it has been left behind as "sole" exception.
Diffstat (limited to 'sys/ufs/ffs')
-rw-r--r--sys/ufs/ffs/ffs_softdep.c9
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c4
2 files changed, 8 insertions, 5 deletions
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index e4838e3..bda95d0 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -564,6 +564,9 @@ MTX_SYSINIT(softdep_lock, &lk, "Softdep Lock", MTX_DEF);
#define ACQUIRE_LOCK(lk) mtx_lock(lk)
#define FREE_LOCK(lk) mtx_unlock(lk)
+#define BUF_AREC(bp) ((bp)->b_lock.lk_flags |= LK_CANRECURSE)
+#define BUF_NOREC(bp) ((bp)->b_lock.lk_flags &= ~LK_CANRECURSE)
+
/*
* Worklist queue management.
* These routines require that the lock be held.
@@ -5251,7 +5254,7 @@ top:
return (0);
loop:
/* While syncing snapshots, we must allow recursive lookups */
- bp->b_lock.lk_flags |= LK_CANRECURSE;
+ BUF_AREC(bp);
ACQUIRE_LOCK(&lk);
/*
* As we hold the buffer locked, none of its dependencies
@@ -5393,7 +5396,7 @@ loop:
/* We reach here only in error and unlocked */
if (error == 0)
panic("softdep_sync_metadata: zero error");
- bp->b_lock.lk_flags &= ~LK_CANRECURSE;
+ BUF_NOREC(bp);
bawrite(bp);
return (error);
}
@@ -5405,7 +5408,7 @@ loop:
break;
}
VI_UNLOCK(vp);
- bp->b_lock.lk_flags &= ~LK_CANRECURSE;
+ BUF_NOREC(bp);
bawrite(bp);
if (nbp != NULL) {
bp = nbp;
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 971694f..f226750 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1363,8 +1363,8 @@ ffs_vget(mp, ino, flags, vpp)
/*
* FFS supports recursive and shared locking.
*/
- vp->v_vnlock->lk_flags |= LK_CANRECURSE;
- vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
+ VN_LOCK_AREC(vp);
+ VN_LOCK_ASHARE(vp);
vp->v_data = ip;
vp->v_bufobj.bo_bsize = fs->fs_bsize;
ip->i_vnode = vp;
OpenPOWER on IntegriCloud