svn commit: r235067 - projects/nfsv4.1-client/sys/fs/nfsclient

Rick Macklem rmacklem at FreeBSD.org
Sat May 5 22:44:09 UTC 2012


Author: rmacklem
Date: Sat May  5 22:44:08 2012
New Revision: 235067
URL: http://svn.freebsd.org/changeset/base/235067

Log:
  Add support for the "return on close" case for NFSv4.1 PNFS layouts.
  The layouts can just be deleted, under the "forgetful client" concept.

Modified:
  projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c

Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c
==============================================================================
--- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c	Sat May  5 21:41:16 2012	(r235066)
+++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c	Sat May  5 22:44:08 2012	(r235067)
@@ -117,6 +117,7 @@ static struct nfsclclient *nfscl_getclnt
 static struct nfsclclient *nfscl_getclntsess(uint8_t *);
 static struct nfscldeleg *nfscl_finddeleg(struct nfsclclient *, u_int8_t *,
     int);
+static void nfscl_retoncloselayout(struct nfsclclient *, uint8_t *, int);
 static void nfscl_reldevinfo_locked(struct nfscldevinfo *);
 static struct nfscllayout *nfscl_findlayout(struct nfsclclient *, u_int8_t *,
     int);
@@ -3062,6 +3063,9 @@ nfscl_doclose(vnode_t vp, struct nfsclcl
 		}
 	}
 
+	/* Return any layouts marked return on close. */
+	nfscl_retoncloselayout(clp, nfhp->nfh_fh, nfhp->nfh_len);
+
 	/* Now process the opens against the server. */
 lookformore:
 	LIST_FOREACH(owp, &clp->nfsc_owner, nfsow_list) {
@@ -4737,6 +4741,30 @@ nfscl_getlayout(struct nfsclclient *clp,
 }
 
 /*
+ * Search for a layout by MDS file handle. If one is found that is marked
+ * "return on close", delete it, since it should now be forgotten.
+ */
+static void
+nfscl_retoncloselayout(struct nfsclclient *clp, uint8_t *fhp, int fhlen)
+{
+	struct nfscllayout *lyp;
+
+tryagain:
+	lyp = nfscl_findlayout(clp, fhp, fhlen);
+	if (lyp != NULL && (lyp->nfsly_flags & NFSLY_RETONCLOSE) != 0) {
+		/*
+		 * Wait for outstanding I/O ops to be done.
+		 */
+		if (lyp->nfsly_refcnt > 0) {
+			(void)mtx_sleep(&lyp->nfsly_refcnt,
+			    NFSCLSTATEMUTEXPTR, PZERO, "nfslyd", 0);
+			goto tryagain;
+		}
+		nfscl_freelayout(lyp);
+	}
+}
+
+/*
  * Dereference a layout.
  */
 void


More information about the svn-src-projects mailing list