summaryrefslogtreecommitdiffstats
path: root/sys/fs/smbfs
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-03-13 12:18:25 +0000
committerjeff <jeff@FreeBSD.org>2005-03-13 12:18:25 +0000
commit0d9df2e12d6a83b8934322f557844cc0bb7bd488 (patch)
treeaa27ba510f7c723270e0278e561283b717a36c7b /sys/fs/smbfs
parent5d7c91ddde246cd0d3f506a01bb53ba5fb41dd5d (diff)
downloadFreeBSD-src-0d9df2e12d6a83b8934322f557844cc0bb7bd488.zip
FreeBSD-src-0d9df2e12d6a83b8934322f557844cc0bb7bd488.tar.gz
- The VI_DOOMED flag now signals the end of a vnode's relationship with
the filesystem. Check that rather than VI_XLOCK. - VOP_INACTIVE should no longer drop the vnode lock. - The vnode lock is required around calls to vrecycle() and vgone(). Sponsored by: Isilon Systems, Inc.
Diffstat (limited to 'sys/fs/smbfs')
-rw-r--r--sys/fs/smbfs/smbfs_io.c2
-rw-r--r--sys/fs/smbfs/smbfs_node.c3
-rw-r--r--sys/fs/smbfs/smbfs_vnops.c15
3 files changed, 3 insertions, 17 deletions
diff --git a/sys/fs/smbfs/smbfs_io.c b/sys/fs/smbfs/smbfs_io.c
index ef18709..a516194 100644
--- a/sys/fs/smbfs/smbfs_io.c
+++ b/sys/fs/smbfs/smbfs_io.c
@@ -672,7 +672,7 @@ smbfs_vinvalbuf(struct vnode *vp, struct thread *td)
struct smbnode *np = VTOSMB(vp);
int error = 0;
- if (vp->v_iflag & VI_XLOCK)
+ if (vp->v_iflag & VI_DOOMED)
return 0;
while (np->n_flag & NFLUSHINPROG) {
diff --git a/sys/fs/smbfs/smbfs_node.c b/sys/fs/smbfs/smbfs_node.c
index e3d2f3b..7ad977b 100644
--- a/sys/fs/smbfs/smbfs_node.c
+++ b/sys/fs/smbfs/smbfs_node.c
@@ -220,8 +220,8 @@ loop:
*/
if ((vp->v_type == VDIR && (np->n_dosattr & SMB_FA_DIR) == 0) ||
(vp->v_type == VREG && (np->n_dosattr & SMB_FA_DIR) != 0)) {
- vput(vp);
vgone(vp);
+ vput(vp);
break;
}
*vpp = vp;
@@ -377,7 +377,6 @@ smbfs_inactive(ap)
np->n_flag &= ~NOPEN;
smbfs_attr_cacheremove(vp);
}
- VOP_UNLOCK(vp, 0, td);
if (np->n_flag & NGONE)
vrecycle(vp, td);
return (0);
diff --git a/sys/fs/smbfs/smbfs_vnops.c b/sys/fs/smbfs/smbfs_vnops.c
index 6125b89..9b27a52 100644
--- a/sys/fs/smbfs/smbfs_vnops.c
+++ b/sys/fs/smbfs/smbfs_vnops.c
@@ -220,10 +220,6 @@ smbfs_open(ap)
return error;
}
-/*
- * XXX: VOP_CLOSE() usually called without lock held which is suck. Here we
- * do some heruistic to determine if vnode should be locked.
- */
static int
smbfs_close(ap)
struct vop_close_args /* {
@@ -238,22 +234,13 @@ smbfs_close(ap)
struct thread *td = ap->a_td;
struct smbnode *np = VTOSMB(vp);
struct smb_cred scred;
- int dolock;
- VI_LOCK(vp);
- dolock = (vp->v_iflag & VI_XLOCK) == 0;
- if (dolock)
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY | LK_INTERLOCK, td);
- else
- VI_UNLOCK(vp);
if (vp->v_type == VDIR && (np->n_flag & NOPEN) != 0 &&
np->n_dirseq != NULL) {
smb_makescred(&scred, td, ap->a_cred);
smbfs_findclose(np->n_dirseq, &scred);
np->n_dirseq = NULL;
}
- if (dolock)
- VOP_UNLOCK(vp, 0, td);
return 0;
}
@@ -1187,9 +1174,9 @@ smbfs_lookup(ap)
return (0);
}
cache_purge(vp);
- vput(vp);
if (killit)
vgone(vp);
+ vput(vp);
if (lockparent && dvp != vp && islastcn)
VOP_UNLOCK(dvp, 0, td);
}
OpenPOWER on IntegriCloud