diff options
-rw-r--r-- | sys/fs/nwfs/nwfs_vnops.c | 10 | ||||
-rw-r--r-- | sys/nwfs/nwfs_vnops.c | 10 |
2 files changed, 16 insertions, 4 deletions
diff --git a/sys/fs/nwfs/nwfs_vnops.c b/sys/fs/nwfs/nwfs_vnops.c index d084503..38e9f19 100644 --- a/sys/fs/nwfs/nwfs_vnops.c +++ b/sys/fs/nwfs/nwfs_vnops.c @@ -262,10 +262,16 @@ nwfs_close(ap) simple_unlock(&vp->v_interlock); return 0; } + simple_unlock(&vp->v_interlock); error = nwfs_vinvalbuf(vp, V_SAVE, ap->a_cred, ap->a_p, 1); - if (--np->opened == 0) { - error = ncp_close_file(NWFSTOCONN(VTONWFS(vp)), &np->n_fh, ap->a_p,ap->a_cred); + simple_lock(&vp->v_interlock); + if (np->opened == 0) { + simple_unlock(&vp->v_interlock); + return 0; } + if (--np->opened == 0) + error = ncp_close_file(NWFSTOCONN(VTONWFS(vp)), &np->n_fh, + ap->a_p, ap->a_cred); simple_unlock(&vp->v_interlock); np->n_atime = 0; return (error); diff --git a/sys/nwfs/nwfs_vnops.c b/sys/nwfs/nwfs_vnops.c index d084503..38e9f19 100644 --- a/sys/nwfs/nwfs_vnops.c +++ b/sys/nwfs/nwfs_vnops.c @@ -262,10 +262,16 @@ nwfs_close(ap) simple_unlock(&vp->v_interlock); return 0; } + simple_unlock(&vp->v_interlock); error = nwfs_vinvalbuf(vp, V_SAVE, ap->a_cred, ap->a_p, 1); - if (--np->opened == 0) { - error = ncp_close_file(NWFSTOCONN(VTONWFS(vp)), &np->n_fh, ap->a_p,ap->a_cred); + simple_lock(&vp->v_interlock); + if (np->opened == 0) { + simple_unlock(&vp->v_interlock); + return 0; } + if (--np->opened == 0) + error = ncp_close_file(NWFSTOCONN(VTONWFS(vp)), &np->n_fh, + ap->a_p, ap->a_cred); simple_unlock(&vp->v_interlock); np->n_atime = 0; return (error); |