diff options
author | attilio <attilio@FreeBSD.org> | 2008-02-24 16:38:58 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2008-02-24 16:38:58 +0000 |
commit | 0d54671a48443b15ac601a80e192bc4c8faed7f9 (patch) | |
tree | 997840c8acf28b15394b97f1d05d64f78bf81fd6 /sys/ufs | |
parent | 1c8346475e6e9a892928e5197425bb703eba2930 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/ufs/ffs/ffs_softdep.c | 9 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vfsops.c | 4 |
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; |