mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-19 10:53:58 +00:00
Add some mutex locking on the nfsnode to the regular NFS client.
Reviewed by: jhb
This commit is contained in:
parent
28a54cacee
commit
ffea18bdfa
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=210834
@ -193,12 +193,14 @@ nfs_inactive(struct vop_inactive_args *ap)
|
|||||||
np = VTONFS(ap->a_vp);
|
np = VTONFS(ap->a_vp);
|
||||||
if (prtactive && vrefcnt(ap->a_vp) != 0)
|
if (prtactive && vrefcnt(ap->a_vp) != 0)
|
||||||
vprint("nfs_inactive: pushing active", ap->a_vp);
|
vprint("nfs_inactive: pushing active", ap->a_vp);
|
||||||
|
mtx_lock(&np->n_mtx);
|
||||||
if (ap->a_vp->v_type != VDIR) {
|
if (ap->a_vp->v_type != VDIR) {
|
||||||
sp = np->n_sillyrename;
|
sp = np->n_sillyrename;
|
||||||
np->n_sillyrename = NULL;
|
np->n_sillyrename = NULL;
|
||||||
} else
|
} else
|
||||||
sp = NULL;
|
sp = NULL;
|
||||||
if (sp) {
|
if (sp) {
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
(void)nfs_vinvalbuf(ap->a_vp, 0, td, 1);
|
(void)nfs_vinvalbuf(ap->a_vp, 0, td, 1);
|
||||||
/*
|
/*
|
||||||
* Remove the silly file that was rename'd earlier
|
* Remove the silly file that was rename'd earlier
|
||||||
@ -207,8 +209,10 @@ nfs_inactive(struct vop_inactive_args *ap)
|
|||||||
crfree(sp->s_cred);
|
crfree(sp->s_cred);
|
||||||
vrele(sp->s_dvp);
|
vrele(sp->s_dvp);
|
||||||
free((caddr_t)sp, M_NFSREQ);
|
free((caddr_t)sp, M_NFSREQ);
|
||||||
|
mtx_lock(&np->n_mtx);
|
||||||
}
|
}
|
||||||
np->n_flag &= NMODIFIED;
|
np->n_flag &= NMODIFIED;
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,7 +521,7 @@ nfs_open(struct vop_open_args *ap)
|
|||||||
*/
|
*/
|
||||||
mtx_lock(&np->n_mtx);
|
mtx_lock(&np->n_mtx);
|
||||||
if (np->n_flag & NMODIFIED) {
|
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);
|
error = nfs_vinvalbuf(vp, V_SAVE, ap->a_td, 1);
|
||||||
if (error == EINTR || error == EIO)
|
if (error == EINTR || error == EIO)
|
||||||
return (error);
|
return (error);
|
||||||
@ -536,9 +536,8 @@ nfs_open(struct vop_open_args *ap)
|
|||||||
return (error);
|
return (error);
|
||||||
mtx_lock(&np->n_mtx);
|
mtx_lock(&np->n_mtx);
|
||||||
np->n_mtime = vattr.va_mtime;
|
np->n_mtime = vattr.va_mtime;
|
||||||
mtx_unlock(&np->n_mtx);
|
|
||||||
} else {
|
} else {
|
||||||
mtx_unlock(&np->n_mtx);
|
mtx_unlock(&np->n_mtx);
|
||||||
error = VOP_GETATTR(vp, &vattr, ap->a_cred);
|
error = VOP_GETATTR(vp, &vattr, ap->a_cred);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
@ -554,22 +553,22 @@ nfs_open(struct vop_open_args *ap)
|
|||||||
mtx_lock(&np->n_mtx);
|
mtx_lock(&np->n_mtx);
|
||||||
np->n_mtime = vattr.va_mtime;
|
np->n_mtime = vattr.va_mtime;
|
||||||
}
|
}
|
||||||
mtx_unlock(&np->n_mtx);
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* If the object has >= 1 O_DIRECT active opens, we disable caching.
|
* If the object has >= 1 O_DIRECT active opens, we disable caching.
|
||||||
*/
|
*/
|
||||||
if (nfs_directio_enable && (fmode & O_DIRECT) && (vp->v_type == VREG)) {
|
if (nfs_directio_enable && (fmode & O_DIRECT) && (vp->v_type == VREG)) {
|
||||||
if (np->n_directio_opens == 0) {
|
if (np->n_directio_opens == 0) {
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
error = nfs_vinvalbuf(vp, V_SAVE, ap->a_td, 1);
|
error = nfs_vinvalbuf(vp, V_SAVE, ap->a_td, 1);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
mtx_lock(&np->n_mtx);
|
mtx_lock(&np->n_mtx);
|
||||||
np->n_flag |= NNONCACHE;
|
np->n_flag |= NNONCACHE;
|
||||||
mtx_unlock(&np->n_mtx);
|
|
||||||
}
|
}
|
||||||
np->n_directio_opens++;
|
np->n_directio_opens++;
|
||||||
}
|
}
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
vnode_create_vobject(vp, vattr.va_size, ap->a_td);
|
vnode_create_vobject(vp, vattr.va_size, ap->a_td);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -1745,7 +1744,9 @@ nfs_remove(struct vop_remove_args *ap)
|
|||||||
error = 0;
|
error = 0;
|
||||||
} else if (!np->n_sillyrename)
|
} else if (!np->n_sillyrename)
|
||||||
error = nfs_sillyrename(dvp, vp, cnp);
|
error = nfs_sillyrename(dvp, vp, cnp);
|
||||||
|
mtx_lock(&np->n_mtx);
|
||||||
np->n_attrstamp = 0;
|
np->n_attrstamp = 0;
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
|
KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user