diff options
author | bp <bp@FreeBSD.org> | 1999-11-21 16:35:29 +0000 |
---|---|---|
committer | bp <bp@FreeBSD.org> | 1999-11-21 16:35:29 +0000 |
commit | daddfe794db9d79d3b731bb9d574267d8ef9e606 (patch) | |
tree | 514e3594ee4cd65524aa158442012c97c7f9a6e1 /sys/nwfs | |
parent | f3267b7b85e46107842897cebb8fbe25d80bb556 (diff) | |
download | FreeBSD-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.c | 10 |
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); |