aboutsummaryrefslogtreecommitdiff
path: root/sys/nfsclient/nfs_vnops.c
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2010-08-04 01:19:11 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2010-08-04 01:19:11 +0000
commitffea18bdfa00d279b6ae0ae4992b456c4868dbb1 (patch)
tree0275d21eb25c1fc17f0e611e98b2eb125cf3acb2 /sys/nfsclient/nfs_vnops.c
parent28a54cacee1e8d5c58741c28a74488133f7ca606 (diff)
downloadsrc-ffea18bdfa00d279b6ae0ae4992b456c4868dbb1.tar.gz
src-ffea18bdfa00d279b6ae0ae4992b456c4868dbb1.zip
Add some mutex locking on the nfsnode to the regular NFS client.
Reviewed by: jhb
Notes
Notes: svn path=/head/; revision=210834
Diffstat (limited to 'sys/nfsclient/nfs_vnops.c')
-rw-r--r--sys/nfsclient/nfs_vnops.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c
index 015a1de98bb9..f1e173d178de 100644
--- a/sys/nfsclient/nfs_vnops.c
+++ b/sys/nfsclient/nfs_vnops.c
@@ -521,7 +521,7 @@ nfs_open(struct vop_open_args *ap)
*/
mtx_lock(&np->n_mtx);
if (np->n_flag & NMODIFIED) {
- mtx_unlock(&np->n_mtx);
+ mtx_unlock(&np->n_mtx);
error = nfs_vinvalbuf(vp, V_SAVE, ap->a_td, 1);
if (error == EINTR || error == EIO)
return (error);
@@ -536,9 +536,8 @@ nfs_open(struct vop_open_args *ap)
return (error);
mtx_lock(&np->n_mtx);
np->n_mtime = vattr.va_mtime;
- mtx_unlock(&np->n_mtx);
} else {
- mtx_unlock(&np->n_mtx);
+ mtx_unlock(&np->n_mtx);
error = VOP_GETATTR(vp, &vattr, ap->a_cred);
if (error)
return (error);
@@ -554,22 +553,22 @@ nfs_open(struct vop_open_args *ap)
mtx_lock(&np->n_mtx);
np->n_mtime = vattr.va_mtime;
}
- mtx_unlock(&np->n_mtx);
}
/*
* If the object has >= 1 O_DIRECT active opens, we disable caching.
*/
if (nfs_directio_enable && (fmode & O_DIRECT) && (vp->v_type == VREG)) {
if (np->n_directio_opens == 0) {
+ mtx_unlock(&np->n_mtx);
error = nfs_vinvalbuf(vp, V_SAVE, ap->a_td, 1);
if (error)
return (error);
mtx_lock(&np->n_mtx);
np->n_flag |= NNONCACHE;
- mtx_unlock(&np->n_mtx);
}
np->n_directio_opens++;
}
+ mtx_unlock(&np->n_mtx);
vnode_create_vobject(vp, vattr.va_size, ap->a_td);
return (0);
}
@@ -1745,7 +1744,9 @@ nfs_remove(struct vop_remove_args *ap)
error = 0;
} else if (!np->n_sillyrename)
error = nfs_sillyrename(dvp, vp, cnp);
+ mtx_lock(&np->n_mtx);
np->n_attrstamp = 0;
+ mtx_unlock(&np->n_mtx);
KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
return (error);
}