Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Jun 2017 20:34:02 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r319959 - in projects/pnfs-planb-server/sys/fs: nfs nfsserver
Message-ID:  <201706142034.v5EKY2gX070205@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Wed Jun 14 20:34:02 2017
New Revision: 319959
URL: https://svnweb.freebsd.org/changeset/base/319959

Log:
  Revert the changes related to Close that updated attributes when only
  reading has been done. Make updating changes upon Close conditional upon
  vfs.nfsd.pnfsstrictattr being set, since it is a performance hit.

Modified:
  projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Wed Jun 14 20:27:14 2017	(r319958)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h	Wed Jun 14 20:34:02 2017	(r319959)
@@ -109,9 +109,9 @@ int nfsrv_openctrl(struct nfsrv_descript *, vnode_t,
 int nfsrv_opencheck(nfsquad_t, nfsv4stateid_t *, struct nfsstate *,
     vnode_t, struct nfsrv_descript *, NFSPROC_T *, int);
 int nfsrv_openupdate(vnode_t, struct nfsstate *, nfsquad_t,
-    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *);
+    nfsv4stateid_t *, struct nfsrv_descript *, NFSPROC_T *, int *);
 int nfsrv_delegupdate(struct nfsrv_descript *, nfsquad_t, nfsv4stateid_t *,
-    vnode_t, int, struct ucred *, NFSPROC_T *);
+    vnode_t, int, struct ucred *, NFSPROC_T *, int *);
 int nfsrv_releaselckown(struct nfsstate *, nfsquad_t, NFSPROC_T *);
 void nfsrv_zapclient(struct nfsclient *, NFSPROC_T *);
 int nfssvc_idname(struct nfsd_idargs *);

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 20:27:14 2017	(r319958)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdserv.c	Wed Jun 14 20:34:02 2017	(r319959)
@@ -59,6 +59,7 @@ extern time_t nfsdev_time;
 extern struct nfsdevicehead nfsrv_devidhead;
 extern int nfsd_debuglevel;
 extern u_long sb_max_adj;
+extern int nfsrv_pnfsatime;
 #endif	/* !APPLEKEXT */
 
 static int	nfs_async = 0;
@@ -3161,7 +3162,7 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 {
 	u_int32_t *tl;
 	struct nfsstate st, *stp = &st;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3204,9 +3205,11 @@ nfsrvd_close(struct nfsrv_descript *nd, __unused int i
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    &writeacc);
 	/* For pNFS, update the attributes. */
-	nfsrv_updatemdsattr(vp, &na, p);
+	if (writeacc != 0 || nfsrv_pnfsatime != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 	vput(vp);
 	if (!nd->nd_repstat) {
 		/*
@@ -3260,7 +3263,7 @@ nfsrvd_delegpurge(struct nfsrv_descript *nd, __unused 
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, NULL, NULL,
-	    NFSV4OP_DELEGPURGE, nd->nd_cred, p);
+	    NFSV4OP_DELEGPURGE, nd->nd_cred, p, NULL);
 nfsmout:
 	NFSEXITCODE2(error, nd);
 	return (error);
@@ -3274,7 +3277,7 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
     vnode_t vp, NFSPROC_T *p, __unused struct nfsexstuff *exp)
 {
 	u_int32_t *tl;
-	int error = 0;
+	int error = 0, writeacc;
 	nfsv4stateid_t stateid;
 	nfsquad_t clientid;
 	struct nfsvattr na;
@@ -3296,9 +3299,10 @@ nfsrvd_delegreturn(struct nfsrv_descript *nd, __unused
 		nd->nd_clientid.qval = clientid.qval;
 	}
 	nd->nd_repstat = nfsrv_delegupdate(nd, clientid, &stateid, vp,
-	    NFSV4OP_DELEGRETURN, nd->nd_cred, p);
+	    NFSV4OP_DELEGRETURN, nd->nd_cred, p, &writeacc);
 	/* For pNFS, update the attributes. */
-	nfsrv_updatemdsattr(vp, &na, p);
+	if (writeacc != 0 || nfsrv_pnfsatime != 0)
+		nfsrv_updatemdsattr(vp, &na, p);
 nfsmout:
 	vput(vp);
 	NFSEXITCODE2(error, nd);
@@ -3362,7 +3366,8 @@ nfsrvd_openconfirm(struct nfsrv_descript *nd, __unused
 		nd->nd_flag |= ND_IMPLIEDCLID;
 		nd->nd_clientid.qval = clientid.qval;
 	}
-	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p);
+	nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid, nd, p,
+	    NULL);
 	if (!nd->nd_repstat) {
 		NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
 		*tl++ = txdr_unsigned(stateid.seqid);
@@ -3465,7 +3470,7 @@ nfsrvd_opendowngrade(struct nfsrv_descript *nd, __unus
 	}
 	if (!nd->nd_repstat)
 		nd->nd_repstat = nfsrv_openupdate(vp, stp, clientid, &stateid,
-		    nd, p);
+		    nd, p, NULL);
 	if (!nd->nd_repstat) {
 		/* For NFSv4.1, set the Current StateID. */
 		if ((nd->nd_flag & ND_NFSV41) != 0) {

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 20:27:14 2017	(r319958)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c	Wed Jun 14 20:34:02 2017	(r319959)
@@ -90,8 +90,8 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, allowreadforwriteopen,
     &nfsrv_allowreadforwriteopen, 0,
     "Allow Reads to be done with Write Access StateIDs");
 
-static int	nfsrv_pnfsatime = 0;
-SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsgetatime, CTLFLAG_RW,
+int	nfsrv_pnfsatime = 0;
+SYSCTL_INT(_vfs_nfsd, OID_AUTO, pnfsstrictatime, CTLFLAG_RW,
     &nfsrv_pnfsatime, 0,
     "For pNFS service, do Getattr ops to keep atime up-to-date");
 
@@ -3291,7 +3291,8 @@ out:
  */
 APPLESTATIC int
 nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp, nfsquad_t clientid,
-    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p)
+    nfsv4stateid_t *stateidp, struct nfsrv_descript *nd, NFSPROC_T *p,
+    int *retwriteaccessp)
 {
 	struct nfsstate *stp, *ownerstp;
 	struct nfsclient *clp;
@@ -3394,6 +3395,12 @@ nfsrv_openupdate(vnode_t vp, struct nfsstate *new_stp,
 	} else if (new_stp->ls_flags & NFSLCK_CLOSE) {
 		ownerstp = stp->ls_openowner;
 		lfp = stp->ls_lfp;
+		if (retwriteaccessp != NULL) {
+			if ((stp->ls_flags & NFSLCK_WRITEACCESS) != 0)
+				*retwriteaccessp = 1;
+			else
+				*retwriteaccessp = 0;
+		}
 		if (nfsrv_dolocallocks != 0 && !LIST_EMPTY(&stp->ls_open)) {
 			/* Get the lf lock */
 			nfsrv_locklf(lfp);
@@ -3450,7 +3457,7 @@ out:
 APPLESTATIC int
 nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t clientid,
     nfsv4stateid_t *stateidp, vnode_t vp, int op, struct ucred *cred,
-    NFSPROC_T *p)
+    NFSPROC_T *p, int *retwriteaccessp)
 {
 	struct nfsstate *stp;
 	struct nfsclient *clp;
@@ -3515,6 +3522,12 @@ nfsrv_delegupdate(struct nfsrv_descript *nd, nfsquad_t
 			error = NFSERR_BADSTATEID;
 			goto out;
 		}
+		if (retwriteaccessp != NULL) {
+			if ((stp->ls_flags & NFSLCK_DELEGWRITE) != 0)
+				*retwriteaccessp = 1;
+			else
+				*retwriteaccessp = 0;
+		}
 		nfsrv_freedeleg(stp);
 	} else {
 		nfsrv_freedeleglist(&clp->lc_olddeleg);
@@ -6336,7 +6349,7 @@ nfsrv_layoutreturn(struct nfsrv_descript *nd, vnode_t 
 	if (kind == NFSV4LAYOUTRET_FILE) {
 		*fndp = 0;
 		error = nfsvno_getfh(vp, &fh, p);
-		if (error == 0 && (iomode & NFSLAYOUTIOMODE_RW) != 0) {
+		if (error == 0) {
 			error = nfsrv_updatemdsattr(vp, &na, p);
 			if (error != 0)
 				printf("nfsrv_layoutreturn: updatemdsattr"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201706142034.v5EKY2gX070205>