diff options
author | rmacklem <rmacklem@FreeBSD.org> | 2011-01-03 00:33:32 +0000 |
---|---|---|
committer | rmacklem <rmacklem@FreeBSD.org> | 2011-01-03 00:33:32 +0000 |
commit | bb862fc0e472220eda22c0370874315a338a4816 (patch) | |
tree | 8a175f9454d5ad63a0305357ecda04d7ca3ead7a /sys/fs/nfsserver/nfs_nfsdsocket.c | |
parent | f818eb99d7d6400259258d456feba02dac8e859e (diff) | |
download | FreeBSD-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.c | 6 |
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); |