From owner-svn-src-projects@FreeBSD.ORG Sat May 5 22:44:09 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 72C54106566C; Sat, 5 May 2012 22:44:09 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 444438FC14; Sat, 5 May 2012 22:44:09 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q45Mi99p085614; Sat, 5 May 2012 22:44:09 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q45Mi9VQ085612; Sat, 5 May 2012 22:44:09 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201205052244.q45Mi9VQ085612@svn.freebsd.org> From: Rick Macklem Date: Sat, 5 May 2012 22:44:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r235067 - projects/nfsv4.1-client/sys/fs/nfsclient X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 May 2012 22:44:09 -0000 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