summaryrefslogtreecommitdiffstats
path: root/sys/fs/nfsserver
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2011-01-05 19:35:35 +0000
committerrmacklem <rmacklem@FreeBSD.org>2011-01-05 19:35:35 +0000
commitaea1c06730bed9a68f87fb00d09aea95d3b325f9 (patch)
tree147b0c25ae77beeef692bf9545ea70b84a60d72f /sys/fs/nfsserver
parent10ecdb0a36cd6aed8cab1cb8cd5b613ce76fa346 (diff)
downloadFreeBSD-src-aea1c06730bed9a68f87fb00d09aea95d3b325f9.zip
FreeBSD-src-aea1c06730bed9a68f87fb00d09aea95d3b325f9.tar.gz
Modify the experimental NFS server so that it calls
vn_start_write() with a non-NULL vp. That way it will find the correct mount point mp and use that mp for the subsequent vn_finished_write() call. Also, it should fail without crashing if the mount point is being forced dismounted because vn_start_write() will set the mp NULL via VOP_GETWRITEMOUNT(). Reviewed by: kib MFC after: 12 days
Diffstat (limited to 'sys/fs/nfsserver')
-rw-r--r--sys/fs/nfsserver/nfs_nfsdsocket.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdsocket.c b/sys/fs/nfsserver/nfs_nfsdsocket.c
index 68cc05a..ebee570 100644
--- a/sys/fs/nfsserver/nfs_nfsdsocket.c
+++ b/sys/fs/nfsserver/nfs_nfsdsocket.c
@@ -498,7 +498,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
u_char tag[NFSV4_SMALLSTR + 1], *tagstr;
vnode_t vp, nvp, savevp;
struct nfsrvfh fh;
- mount_t mp, savemp;
+ mount_t mp, savemp, temp_mp = NULL;
struct ucred *credanon;
struct nfsexstuff nes, vpnes, savevpnes;
static u_int64_t compref = 0;
@@ -837,7 +837,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
}
VREF(vp);
if (nfsv4_opflag[op].modifyfs)
- NFS_STARTWRITE(NULL, &mp);
+ vn_start_write(vp, &temp_mp, V_WAIT);
error = (*(nfsrv4_ops1[op]))(nd, isdgram, vp,
&nvp, (fhandle_t *)fh.nfsrvfh_data, p, &vpnes);
if (!error && !nd->nd_repstat) {
@@ -871,7 +871,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
vrele(nvp);
}
if (nfsv4_opflag[op].modifyfs)
- NFS_ENDWRITE(mp);
+ vn_finished_write(temp_mp);
} else if (nfsv4_opflag[op].retfh == 2) {
if (vp == NULL || savevp == NULL) {
nd->nd_repstat = NFSERR_NOFILEHANDLE;
@@ -881,7 +881,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
break;
}
if (nfsv4_opflag[op].modifyfs)
- NFS_STARTWRITE(NULL, &mp);
+ vn_start_write(savevp, &temp_mp, V_WAIT);
if (vn_lock(savevp, LK_EXCLUSIVE) == 0) {
VREF(vp);
VREF(savevp);
@@ -890,14 +890,15 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
} else
nd->nd_repstat = NFSERR_PERM;
if (nfsv4_opflag[op].modifyfs)
- NFS_ENDWRITE(mp);
+ vn_finished_write(temp_mp);
} else {
if (nfsv4_opflag[op].retfh != 0)
panic("nfsrvd_compound");
if (nfsv4_opflag[op].needscfh) {
if (vp != NULL) {
if (nfsv4_opflag[op].modifyfs)
- NFS_STARTWRITE(NULL, &mp);
+ vn_start_write(vp, &temp_mp,
+ V_WAIT);
if (vn_lock(vp, nfsv4_opflag[op].lktype)
== 0)
VREF(vp);
@@ -921,7 +922,7 @@ nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
error = (*(nfsrv4_ops0[op]))(nd,
isdgram, vp, p, &vpnes);
if (nfsv4_opflag[op].modifyfs)
- NFS_ENDWRITE(mp);
+ vn_finished_write(temp_mp);
} else {
error = (*(nfsrv4_ops0[op]))(nd, isdgram,
NULL, p, &vpnes);
OpenPOWER on IntegriCloud