svn commit: r217023 - head/sys/fs/nfsserver
Rick Macklem
rmacklem at FreeBSD.org
Wed Jan 5 19:35:35 UTC 2011
Author: rmacklem
Date: Wed Jan 5 19:35:35 2011
New Revision: 217023
URL: http://svn.freebsd.org/changeset/base/217023
Log:
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
Modified:
head/sys/fs/nfsserver/nfs_nfsdsocket.c
Modified: head/sys/fs/nfsserver/nfs_nfsdsocket.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdsocket.c Wed Jan 5 19:33:16 2011 (r217022)
+++ head/sys/fs/nfsserver/nfs_nfsdsocket.c Wed Jan 5 19:35:35 2011 (r217023)
@@ -498,7 +498,7 @@ nfsrvd_compound(struct nfsrv_descript *n
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 *n
}
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 *n
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 *n
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 *n
} 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 *n
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);
More information about the svn-src-all
mailing list