diff options
author | Rick Macklem <rmacklem@FreeBSD.org> | 2010-08-04 01:19:11 +0000 |
---|---|---|
committer | Rick Macklem <rmacklem@FreeBSD.org> | 2010-08-04 01:19:11 +0000 |
commit | ffea18bdfa00d279b6ae0ae4992b456c4868dbb1 (patch) | |
tree | 0275d21eb25c1fc17f0e611e98b2eb125cf3acb2 /sys/nfsclient/nfs_vnops.c | |
parent | 28a54cacee1e8d5c58741c28a74488133f7ca606 (diff) | |
download | src-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.c | 11 |
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); } |