Date: Sat, 5 May 2012 22:44:09 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r235067 - projects/nfsv4.1-client/sys/fs/nfsclient Message-ID: <201205052244.q45Mi9VQ085612@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205052244.q45Mi9VQ085612>