summaryrefslogtreecommitdiffstats
path: root/sys/nwfs
diff options
context:
space:
mode:
authorbp <bp@FreeBSD.org>1999-11-21 16:35:29 +0000
committerbp <bp@FreeBSD.org>1999-11-21 16:35:29 +0000
commitdaddfe794db9d79d3b731bb9d574267d8ef9e606 (patch)
tree514e3594ee4cd65524aa158442012c97c7f9a6e1 /sys/nwfs
parentf3267b7b85e46107842897cebb8fbe25d80bb556 (diff)
downloadFreeBSD-src-daddfe794db9d79d3b731bb9d574267d8ef9e606.zip
FreeBSD-src-daddfe794db9d79d3b731bb9d574267d8ef9e606.tar.gz
Remove race condition under SMP.
Noted by: Denis Kalinin <denis@mail.rbc.ru>
Diffstat (limited to 'sys/nwfs')
-rw-r--r--sys/nwfs/nwfs_vnops.c10
1 files changed, 8 insertions, 2 deletions
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);
OpenPOWER on IntegriCloud