- Set LK_NOSHARE for snapshot locks. snapshots require exclusive only

access.
 - Remove the hack from ffs_lock() to implement LK_NOSHARE in a ffs
   specific way.

Sponsored by:	Isilon Systems, Inc.
This commit is contained in:
Jeff Roberson 2005-03-31 05:21:17 +00:00
parent c4c0ec5ba7
commit ec3db02a3e
2 changed files with 2 additions and 22 deletions

View File

@ -522,7 +522,7 @@ loop:
sn = malloc(sizeof *sn, M_UFSMNT, M_WAITOK | M_ZERO);
TAILQ_INIT(&sn->sn_head);
lockinit(&sn->sn_lock, PVFS, "snaplk", VLKTIMEOUT,
LK_CANRECURSE);
LK_CANRECURSE | LK_NOSHARE);
VI_LOCK(vp);
vp->v_vnlock = &sn->sn_lock;
devvp->v_rdev->si_snapdata = sn;
@ -1846,7 +1846,7 @@ ffs_snapshot_mount(mp)
sn = malloc(sizeof *sn, M_UFSMNT, M_WAITOK | M_ZERO);
TAILQ_INIT(&sn->sn_head);
lockinit(&sn->sn_lock, PVFS, "snaplk", VLKTIMEOUT,
LK_CANRECURSE);
LK_CANRECURSE | LK_NOSHARE);
VI_LOCK(vp);
vp->v_vnlock = &sn->sn_lock;
devvp->v_rdev->si_snapdata = sn;

View File

@ -330,9 +330,6 @@ loop:
return (ffs_update(vp, wait));
}
/*
* Snapshots require all lock requests to be exclusive.
*/
static int
ffs_lock(ap)
struct vop_lock_args /* {
@ -341,23 +338,6 @@ ffs_lock(ap)
struct thread *a_td;
} */ *ap;
{
struct vnode *vp = ap->a_vp;
/*
* v_data could be NULL if a thread attempts to lock a
* vnode that is being recycled. Just hit the normal
* vnode lock in this case. Grab the interlock so we may
* safely inspect the vnode.
*/
if ((ap->a_flags & LK_INTERLOCK) == 0) {
VI_LOCK(vp);
ap->a_flags |= LK_INTERLOCK;
}
if (vp->v_data && (VTOI(vp)->i_flags & SF_SNAPSHOT) &&
((ap->a_flags & LK_TYPE_MASK) == LK_SHARED)) {
ap->a_flags &= ~LK_TYPE_MASK;
ap->a_flags |= LK_EXCLUSIVE;
}
return (VOP_LOCK_APV(&ufs_vnodeops, ap));
}