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