summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorart <art@openbsd.org>2002-02-23 23:47:13 +0000
committerart <art@openbsd.org>2002-02-23 23:47:13 +0000
commit95d419fc071ccd14200a0a24554dfc021b4303db (patch)
tree19bad6947cd38df916e12987879ede83c0a6bd9b
parentSRC prefix is not required for some operations. (diff)
downloadwireguard-openbsd-95d419fc071ccd14200a0a24554dfc021b4303db.tar.xz
wireguard-openbsd-95d419fc071ccd14200a0a24554dfc021b4303db.zip
Sigh. The diff is out for testing for three months without a single problem.
Two days after commit people report serious lockups all over the place. Back out nfs locking changes.
-rw-r--r--sys/nfs/nfs_node.c36
-rw-r--r--sys/nfs/nfs_vfsops.c4
-rw-r--r--sys/nfs/nfs_vnops.c167
-rw-r--r--sys/nfs/nfsnode.h9
4 files changed, 56 insertions, 160 deletions
diff --git a/sys/nfs/nfs_node.c b/sys/nfs/nfs_node.c
index ba0156fb7ab..ac3f9de4b46 100644
--- a/sys/nfs/nfs_node.c
+++ b/sys/nfs/nfs_node.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_node.c,v 1.22 2002/02/22 20:19:14 csapuntz Exp $ */
+/* $OpenBSD: nfs_node.c,v 1.23 2002/02/23 23:47:13 art Exp $ */
/* $NetBSD: nfs_node.c,v 1.16 1996/02/18 11:53:42 fvdl Exp $ */
/*
@@ -145,8 +145,6 @@ loop:
vp = nvp;
np = pool_get(&nfs_node_pool, PR_WAITOK);
bzero((caddr_t)np, sizeof *np);
- lockinit(&np->n_lock, PINOD, "nfsvlock", 0, 0);
- lockmgr(&np->n_lock, LK_EXCLUSIVE, 0, p);
vp->v_data = np;
np->n_vnode = vp;
@@ -196,32 +194,19 @@ nfs_inactive(v)
np->n_sillyrename = (struct sillyrename *)0;
} else
sp = (struct sillyrename *)0;
-
- /*
- * Remove the silly file that was rename'd earlier
- */
- if (sp)
- (void) nfs_vinvalbuf(ap->a_vp, 0, sp->s_cred, p, 1);
-
- np->n_flag &= (NMODIFIED | NFLUSHINPROG | NFLUSHWANT);
-
- VOP_UNLOCK(ap->a_vp, 0, ap->a_p);
-
if (sp) {
- /* Note: sp->s_dvp may already be locked somewhere up in
- the call stack as _inactive is called from many places
- in the code. Thus, this call below requires that
- recursive locks be enabled in vn_lock.
- */
- int error = vn_lock(sp->s_dvp, LK_EXCLUSIVE, ap->a_p);
- if (error == 0) {
- nfs_removeit(sp);
- vput(sp->s_dvp);
- }
+ /*
+ * Remove the silly file that was rename'd earlier
+ */
+ (void) nfs_vinvalbuf(ap->a_vp, 0, sp->s_cred, p, 1);
+ nfs_removeit(sp);
crfree(sp->s_cred);
- FREE((caddr_t)sp, M_NFSREQ);
+ vrele(sp->s_dvp);
+ FREE((caddr_t)sp, M_NFSREQ);
}
+ np->n_flag &= (NMODIFIED | NFLUSHINPROG | NFLUSHWANT);
+ VOP_UNLOCK(ap->a_vp, 0, ap->a_p);
return (0);
}
@@ -271,3 +256,4 @@ nfs_reclaim(v)
vp->v_data = NULL;
return (0);
}
+
diff --git a/sys/nfs/nfs_vfsops.c b/sys/nfs/nfs_vfsops.c
index 6a2ede14b32..043819c109b 100644
--- a/sys/nfs/nfs_vfsops.c
+++ b/sys/nfs/nfs_vfsops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_vfsops.c,v 1.46 2002/02/22 20:19:14 csapuntz Exp $ */
+/* $OpenBSD: nfs_vfsops.c,v 1.47 2002/02/23 23:47:13 art Exp $ */
/* $NetBSD: nfs_vfsops.c,v 1.46.4.1 1996/05/25 22:40:35 fvdl Exp $ */
/*
@@ -181,7 +181,7 @@ nfs_statfs(mp, sbp, p)
}
strncpy(&sbp->f_fstypename[0], mp->mnt_vfc->vfc_name, MFSNAMELEN);
nfsm_reqdone;
- vput(vp);
+ vrele(vp);
crfree(cred);
return (error);
}
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index fd83fbe2135..2dca5d994b6 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_vnops.c,v 1.48 2002/02/22 20:19:14 csapuntz Exp $ */
+/* $OpenBSD: nfs_vnops.c,v 1.49 2002/02/23 23:47:13 art Exp $ */
/* $NetBSD: nfs_vnops.c,v 1.62.4.1 1996/07/08 20:26:52 jtc Exp $ */
/*
@@ -693,7 +693,6 @@ nfs_lookup(v)
nfsfh_t *fhp;
struct nfsnode *np;
int lockparent, wantparent, error = 0, attrflag, fhsize;
- int dvp_locked = 1;
int v3 = NFS_ISV3(dvp);
*vpp = NULLVP;
@@ -702,9 +701,10 @@ nfs_lookup(v)
return (EROFS);
if (dvp->v_type != VDIR)
return (ENOTDIR);
- lockparent = ((flags & (LOCKPARENT | ISLASTCN)) == (LOCKPARENT | ISLASTCN));
+ lockparent = flags & LOCKPARENT;
wantparent = flags & (LOCKPARENT|WANTPARENT);
nmp = VFSTONFS(dvp->v_mount);
+ np = VTONFS(dvp);
if ((error = cache_lookup(dvp, vpp, cnp)) != 0 && error != ENOENT) {
struct vattr vattr;
int vpid;
@@ -718,19 +718,10 @@ nfs_lookup(v)
if (dvp == newvp) {
VREF(newvp);
error = 0;
- } else if (flags & ISDOTDOT) {
- VOP_UNLOCK(dvp, 0, p);
- dvp_locked = 0;
- error = vget(newvp, LK_EXCLUSIVE, p);
- if (error != 0)
- newvp = NULL;
- } else {
+ } else
error = vget(newvp, LK_EXCLUSIVE, p);
- if (error != 0)
- newvp = NULL;
- }
- if (error == 0) {
+ if (!error) {
if (vpid == newvp->v_id) {
if (!VOP_GETATTR(newvp, &vattr, cnp->cn_cred, cnp->cn_proc)
&& vattr.va_ctime.tv_sec == VTONFS(newvp)->n_ctime) {
@@ -738,30 +729,15 @@ nfs_lookup(v)
if (cnp->cn_nameiop != LOOKUP &&
(flags & ISLASTCN))
cnp->cn_flags |= SAVENAME;
- goto exit;
+ return (0);
}
cache_purge(newvp);
}
- }
- *vpp = NULLVP;
-
- if (newvp == dvp)
vrele(newvp);
- else if (newvp != NULL)
- vput(newvp);
-
- if (!dvp_locked) {
- vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, p);
- dvp_locked = 1;
}
+ *vpp = NULLVP;
}
-
- np = VTONFS(dvp);
- if (np == NULL) {
- error = ERESTART;
- goto exit;
- }
- error = 0;
+ error = 0;
newvp = NULLVP;
nfsstats.lookupcache_misses++;
nfsstats.rpccnt[NFSPROC_LOOKUP]++;
@@ -784,13 +760,12 @@ nfs_lookup(v)
if (cnp->cn_nameiop == RENAME && wantparent && (flags & ISLASTCN)) {
if (NFS_CMPFH(np, fhp, fhsize)) {
m_freem(mrep);
- error = EISDIR;
- goto exit;
+ return (EISDIR);
}
error = nfs_nget(dvp->v_mount, fhp, fhsize, &np);
if (error) {
m_freem(mrep);
- goto exit;
+ return (error);
}
newvp = NFSTOV(np);
if (v3) {
@@ -801,8 +776,7 @@ nfs_lookup(v)
*vpp = newvp;
m_freem(mrep);
cnp->cn_flags |= SAVENAME;
- error = 0;
- goto exit;
+ return (0);
}
if (NFS_CMPFH(np, fhp, fhsize)) {
@@ -812,7 +786,7 @@ nfs_lookup(v)
error = nfs_nget(dvp->v_mount, fhp, fhsize, &np);
if (error) {
m_freem(mrep);
- goto exit;
+ return (error);
}
newvp = NFSTOV(np);
}
@@ -831,6 +805,8 @@ nfs_lookup(v)
*vpp = newvp;
nfsm_reqdone;
if (error) {
+ if (newvp != NULLVP)
+ vrele(newvp);
if ((cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME) &&
(flags & ISLASTCN) && error == ENOENT) {
if (dvp->v_mount->mnt_flag & MNT_RDONLY)
@@ -841,25 +817,6 @@ nfs_lookup(v)
if (cnp->cn_nameiop != LOOKUP && (flags & ISLASTCN))
cnp->cn_flags |= SAVENAME;
}
-
- exit:
- if (error != 0) {
- if (newvp == dvp) {
- vrele(newvp);
- } else if (newvp != NULL) {
- vput(newvp);
- }
- }
-
- if (!dvp_locked) {
- if (error != 0 || lockparent) {
- vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, p);
- }
- } else {
- if (error == 0 && !lockparent) {
- VOP_UNLOCK(dvp, 0, p);
- }
- }
return (error);
}
@@ -1171,7 +1128,7 @@ nfs_mknodrpc(dvp, vpp, cnp, vap)
nfsm_mtofh(dvp, newvp, v3, gotvp);
if (!gotvp) {
if (newvp) {
- vput(newvp);
+ vrele(newvp);
newvp = (struct vnode *)0;
}
error = nfs_lookitup(dvp, cnp->cn_nameptr,
@@ -1184,10 +1141,8 @@ nfs_mknodrpc(dvp, vpp, cnp, vap)
nfsm_wcc_data(dvp, wccflag);
nfsm_reqdone;
if (error) {
- if (newvp) {
- vput(newvp);
- newvp = NULL;
- }
+ if (newvp)
+ vrele(newvp);
} else {
if (cnp->cn_flags & MAKEENTRY)
cache_enter(dvp, newvp, cnp);
@@ -1197,7 +1152,7 @@ nfs_mknodrpc(dvp, vpp, cnp, vap)
VTONFS(dvp)->n_flag |= NMODIFIED;
if (!wccflag)
VTONFS(dvp)->n_attrstamp = 0;
- vput(dvp);
+ vrele(dvp);
return (error);
}
@@ -1220,9 +1175,8 @@ nfs_mknod(v)
int error;
error = nfs_mknodrpc(ap->a_dvp, &newvp, ap->a_cnp, ap->a_vap);
- if (error == 0)
- vput(newvp);
-
+ if (!error)
+ vrele(newvp);
return (error);
}
@@ -1298,7 +1252,7 @@ again:
nfsm_mtofh(dvp, newvp, v3, gotvp);
if (!gotvp) {
if (newvp) {
- vput(newvp);
+ vrele(newvp);
newvp = (struct vnode *)0;
}
error = nfs_lookitup(dvp, cnp->cn_nameptr,
@@ -1316,7 +1270,7 @@ again:
goto again;
}
if (newvp)
- vput(newvp);
+ vrele(newvp);
} else if (v3 && (fmode & O_EXCL))
error = nfs_setattrrpc(newvp, vap, cnp->cn_cred, cnp->cn_proc);
if (!error) {
@@ -1328,7 +1282,7 @@ again:
VTONFS(dvp)->n_flag |= NMODIFIED;
if (!wccflag)
VTONFS(dvp)->n_attrstamp = 0;
- vput(dvp);
+ vrele(dvp);
return (error);
}
@@ -1400,8 +1354,8 @@ nfs_remove(v)
error = nfs_sillyrename(dvp, vp, cnp);
FREE(cnp->cn_pnbuf, M_NAMEI);
np->n_attrstamp = 0;
- vput(dvp);
- vput(vp);
+ vrele(dvp);
+ vrele(vp);
return (error);
}
@@ -1412,7 +1366,7 @@ int
nfs_removeit(sp)
struct sillyrename *sp;
{
-
+
return (nfs_removerpc(sp->s_dvp, sp->s_name, sp->s_namlen, sp->s_cred,
(struct proc *)0));
}
@@ -1492,7 +1446,7 @@ nfs_rename(v)
*/
if (tvp && tvp->v_usecount > 1 && !VTONFS(tvp)->n_sillyrename &&
tvp->v_type != VDIR && !nfs_sillyrename(tdvp, tvp, tcnp)) {
- vput(tvp);
+ vrele(tvp);
tvp = NULL;
}
@@ -1700,12 +1654,12 @@ nfs_symlink(v)
}
nfsm_reqdone;
if (newvp)
- vput(newvp);
+ vrele(newvp);
FREE(cnp->cn_pnbuf, M_NAMEI);
VTONFS(dvp)->n_flag |= NMODIFIED;
if (!wccflag)
VTONFS(dvp)->n_attrstamp = 0;
- vput(dvp);
+ vrele(dvp);
/*
* Kludge: Map EEXIST => 0 assuming that it is a reply to a retry.
*/
@@ -1775,7 +1729,7 @@ nfs_mkdir(v)
*/
if (error == EEXIST || (!error && !gotvp)) {
if (newvp) {
- vput(newvp);
+ vrele(newvp);
newvp = (struct vnode *)0;
}
error = nfs_lookitup(dvp, cnp->cn_nameptr, len, cnp->cn_cred,
@@ -1788,11 +1742,11 @@ nfs_mkdir(v)
}
if (error) {
if (newvp)
- vput(newvp);
+ vrele(newvp);
} else
*ap->a_vpp = newvp;
FREE(cnp->cn_pnbuf, M_NAMEI);
- vput(dvp);
+ vrele(dvp);
return (error);
}
@@ -1821,7 +1775,7 @@ nfs_rmdir(v)
if (dvp == vp) {
vrele(dvp);
- vput(dvp);
+ vrele(dvp);
FREE(cnp->cn_pnbuf, M_NAMEI);
return (EINVAL);
}
@@ -1840,8 +1794,8 @@ nfs_rmdir(v)
VTONFS(dvp)->n_attrstamp = 0;
cache_purge(dvp);
cache_purge(vp);
- vput(vp);
- vput(dvp);
+ vrele(vp);
+ vrele(dvp);
/*
* Kludge: Map ENOENT => 0 assuming that you have a reply to a retry.
*/
@@ -2388,7 +2342,7 @@ nfs_readdirplusrpc(struct vnode *vp, struct uio *uiop, struct ucred *cred,
nfsm_adv(nfsm_rndup(i));
}
if (newvp != NULLVP) {
- vput(newvp);
+ vrele(newvp);
newvp = NULLVP;
}
nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
@@ -2429,7 +2383,7 @@ nfs_readdirplusrpc(struct vnode *vp, struct uio *uiop, struct ucred *cred,
nfsmout:
if (newvp != NULLVP)
- vput(newvp);
+ vrele(newvp);
return (error);
}
@@ -2553,7 +2507,7 @@ nfs_lookitup(dvp, name, len, cred, procp, npp)
nfsm_postop_attr(newvp, attrflag);
if (!attrflag && *npp == NULL) {
m_freem(mrep);
- vput(newvp);
+ vrele(newvp);
return (ENOENT);
}
} else
@@ -2563,7 +2517,7 @@ nfs_lookitup(dvp, name, len, cred, procp, npp)
if (npp && *npp == NULL) {
if (error) {
if (newvp)
- vput(newvp);
+ vrele(newvp);
} else
*npp = np;
}
@@ -3227,46 +3181,3 @@ nfsfifo_close(v)
return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_close), ap));
}
#endif /* ! FIFO */
-
-
-int
-nfs_lock(v)
- void *v;
-{
- struct vop_lock_args /* {
- struct vnode *a_vp;
- int a_flags;
- sturct proc *a_p;
- } */ *ap = v;
- struct vnode *vp = ap->a_vp;
-
- return (lockmgr(&VTONFS(vp)->n_lock, ap->a_flags, &vp->v_interlock,
- ap->a_p));
-}
-
-int
-nfs_unlock(v)
- void *v;
-{
- struct vop_unlock_args /* {
- struct vnode *a_vp;
- int a_flags;
- struct proc *a_p;
- } */ *ap = v;
- struct vnode *vp = ap->a_vp;
-
- return (lockmgr(&VTONFS(vp)->n_lock, ap->a_flags | LK_RELEASE,
- &vp->v_interlock, ap->a_p));
-}
-
-int
-nfs_islocked(v)
- void *v;
-{
- struct vop_islocked_args /* {
- struct vnode *a_vp;
- } */ *ap = v;
-
- return (lockstatus(&VTONFS(ap->a_vp)->n_lock));
-}
-
diff --git a/sys/nfs/nfsnode.h b/sys/nfs/nfsnode.h
index e1a8e41e57d..b46032bad85 100644
--- a/sys/nfs/nfsnode.h
+++ b/sys/nfs/nfsnode.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfsnode.h,v 1.14 2002/02/22 20:19:14 csapuntz Exp $ */
+/* $OpenBSD: nfsnode.h,v 1.15 2002/02/23 23:47:13 art Exp $ */
/* $NetBSD: nfsnode.h,v 1.16 1996/02/18 11:54:04 fvdl Exp $ */
/*
@@ -119,7 +119,6 @@ struct nfsnode {
nfsfh_t n_fh; /* Small File Handle */
struct ucred *n_rcred;
struct ucred *n_wcred;
- struct lock n_lock;
};
#define n_atim n_un1.nf_atim
@@ -188,9 +187,9 @@ int nfs_readdir __P((void *));
int nfs_readlink __P((void *));
int nfs_inactive __P((void *));
int nfs_reclaim __P((void *));
-int nfs_lock __P((void *));
-int nfs_unlock __P((void *));
-int nfs_islocked __P((void *));
+#define nfs_lock ((int (*) __P((void *)))vop_generic_lock)
+#define nfs_unlock ((int (*) __P((void *)))vop_generic_unlock)
+#define nfs_islocked ((int (*) __P((void *)))vop_generic_islocked)
int nfs_bmap __P((void *));
int nfs_strategy __P((void *));
int nfs_print __P((void *));