summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-03-31 05:21:17 +0000
committerjeff <jeff@FreeBSD.org>2005-03-31 05:21:17 +0000
commitf13ee4b8f22cddc38cdb5c5b16cd6f8f3cf1a8dd (patch)
treee58e8398e8baebbe5bb816f6b65d15c5eada1e87 /sys/ufs
parent27112458d3c50f602c330698adc64c6fdd225307 (diff)
downloadFreeBSD-src-f13ee4b8f22cddc38cdb5c5b16cd6f8f3cf1a8dd.zip
FreeBSD-src-f13ee4b8f22cddc38cdb5c5b16cd6f8f3cf1a8dd.tar.gz
- 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.
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c4
-rw-r--r--sys/ufs/ffs/ffs_vnops.c20
2 files changed, 2 insertions, 22 deletions
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index 70ba429..6b85472 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -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;
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index 0362876..13b6272 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -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));
}
OpenPOWER on IntegriCloud