summaryrefslogtreecommitdiffstats
path: root/sys/fs/nfsserver/nfs_nfsdsocket.c
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2011-01-03 00:33:32 +0000
committerrmacklem <rmacklem@FreeBSD.org>2011-01-03 00:33:32 +0000
commitbb862fc0e472220eda22c0370874315a338a4816 (patch)
tree8a175f9454d5ad63a0305357ecda04d7ca3ead7a /sys/fs/nfsserver/nfs_nfsdsocket.c
parentf818eb99d7d6400259258d456feba02dac8e859e (diff)
downloadFreeBSD-src-bb862fc0e472220eda22c0370874315a338a4816.zip
FreeBSD-src-bb862fc0e472220eda22c0370874315a338a4816.tar.gz
Modify the experimental NFSv4 server so that the lookup
ops return a locked vnode. This ensures that the associated mount point will always be valid for the code that follows the operation. Also add a couple of additional checks for non-error to the other functions that create file objects. MFC after: 2 weeks
Diffstat (limited to 'sys/fs/nfsserver/nfs_nfsdsocket.c')
-rw-r--r--sys/fs/nfsserver/nfs_nfsdsocket.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdsocket.c b/sys/fs/nfsserver/nfs_nfsdsocket.c
index fb6a87c..68cc05a 100644
--- a/sys/fs/nfsserver/nfs_nfsdsocket.c
+++ b/sys/fs/nfsserver/nfs_nfsdsocket.c
@@ -861,10 +861,14 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
nfsvno_lockvfs(mp);
}
}
+ if (op == NFSV4OP_LOOKUP || op == NFSV4OP_LOOKUPP)
+ /* Lookup ops return a locked vnode */
+ VOP_UNLOCK(nvp, 0);
if (!nd->nd_repstat) {
vrele(vp);
vp = nvp;
- }
+ } else
+ vrele(nvp);
}
if (nfsv4_opflag[op].modifyfs)
NFS_ENDWRITE(mp);
OpenPOWER on IntegriCloud