Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 May 2021 03:42:41 GMT
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 645f01722694 - stable/12 - NFSv4 server: Re-establish the delegation recall timeout
Message-ID:  <202105310342.14V3gfma091256@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by rmacklem:

URL: https://cgit.FreeBSD.org/src/commit/?id=645f01722694a0594c67cbf96ee10928b6676f67

commit 645f01722694a0594c67cbf96ee10928b6676f67
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2021-05-16 23:40:01 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2021-05-31 03:39:36 +0000

    NFSv4 server: Re-establish the delegation recall timeout
    
    Commit 7a606f280a3e allowed the server to do retries of CB_RECALL
    callbacks every couple of seconds.  This was needed to allow the
    Linux client to re-establish the back channel.
    However this patch broke the delegation timeout check, such that
    it would just keep retrying CB_RECALLS.
    If the client has crashed or been network patitioned from the
    server, this continues until the client TCP reconnects to
    the server and re-establishes the back channel.
    
    This patch modifies the code such that it still times out the
    delegation recall after some minutes, so that the server will
    allow the conflicting client request once the delegation times out.
    
    This patch only affects the NFSv4 server when delegations are
    enabled and a NFSv4 client that holds a delegation has crashed
    or been network partitioned from the server for at least several
    minutes when a delegation needs to be recalled.
    
    (cherry picked from commit 46269d66ed02598c86756d81a7d7b27ec0f0c5cd)
---
 sys/fs/nfsserver/nfs_nfsdstate.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c
index 9171891478c1..abd4099a7ee2 100644
--- a/sys/fs/nfsserver/nfs_nfsdstate.c
+++ b/sys/fs/nfsserver/nfs_nfsdstate.c
@@ -5279,8 +5279,9 @@ nfsrv_delegconflict(struct nfsstate *stp, int *haslockp, NFSPROC_T *p,
 	 * - check to see if the delegation has expired
 	 *   - if so, get the v4root lock and then expire it
 	 */
-	if ((stp->ls_flags & NFSLCK_DELEGRECALL) == 0 || stp->ls_lastrecall <
-	    time_uptime) {
+	if ((stp->ls_flags & NFSLCK_DELEGRECALL) == 0 || (stp->ls_lastrecall <
+	    NFSD_MONOSEC && clp->lc_expiry >= NFSD_MONOSEC &&
+	    stp->ls_delegtime >= NFSD_MONOSEC)) {
 		/*
 		 * - do a recall callback, since not yet done
 		 * For now, never allow truncate to be set. To use



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