All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Haynes <thomas.haynes@primarydata.com>
To: Trond Myklebust <Trond.Myklebust@primarydata.com>
Cc: Linux NFS Mailing List <linux-nfs@vger.kernel.org>
Subject: [PATCH 49/50] nfs41: wait for LAYOUTRETURN before retrying LAYOUTGET
Date: Tue, 16 Dec 2014 11:01:52 -0800	[thread overview]
Message-ID: <1418756513-95187-50-git-send-email-loghyr@primarydata.com> (raw)
In-Reply-To: <1418756513-95187-1-git-send-email-loghyr@primarydata.com>

From: Peng Tao <tao.peng@primarydata.com>

Also take care to stop waiting if someone clears retry bit.

Signed-off-by: Peng Tao <tao.peng@primarydata.com>
---
 fs/nfs/nfs4proc.c |  4 +++-
 fs/nfs/pnfs.c     | 39 ++++++++++++++++++++++++++++++++++++++-
 fs/nfs/pnfs.h     |  5 ++++-
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 72c5e01..f05e965 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -7786,7 +7786,9 @@ static void nfs4_layoutreturn_release(void *calldata)
 	spin_lock(&lo->plh_inode->i_lock);
 	if (lrp->res.lrs_present)
 		pnfs_set_layout_stateid(lo, &lrp->res.stateid, true);
-	clear_bit(NFS_LAYOUT_RETURN, &lo->plh_flags);
+	clear_bit_unlock(NFS_LAYOUT_RETURN, &lo->plh_flags);
+	smp_mb__after_atomic();
+	wake_up_bit(&lo->plh_flags, NFS_LAYOUT_RETURN);
 	clear_bit(NFS_LAYOUT_RETURN_BEFORE_CLOSE, &lo->plh_flags);
 	rpc_wake_up(&NFS_SERVER(lo->plh_inode)->roc_rpcwaitq);
 	lo->plh_block_lgets--;
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index fec1d897..8c1440d 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1404,6 +1404,26 @@ static bool pnfs_within_mdsthreshold(struct nfs_open_context *ctx,
 	return ret;
 }
 
+/* stop waiting if someone clears NFS_LAYOUT_RETRY_LAYOUTGET bit. */
+static int pnfs_layoutget_retry_bit_wait(struct wait_bit_key *key)
+{
+	if (!test_bit(NFS_LAYOUT_RETRY_LAYOUTGET, key->flags))
+		return 1;
+	return nfs_wait_bit_killable(key);
+}
+
+static bool pnfs_prepare_to_retry_layoutget(struct pnfs_layout_hdr *lo)
+{
+	/*
+	 * send layoutcommit as it can hold up layoutreturn due to lseg
+	 * reference
+	 */
+	pnfs_layoutcommit_inode(lo->plh_inode, false);
+	return !wait_on_bit_action(&lo->plh_flags, NFS_LAYOUT_RETURN,
+				   pnfs_layoutget_retry_bit_wait,
+				   TASK_UNINTERRUPTIBLE);
+}
+
 /*
  * Layout segment is retreived from the server if not cached.
  * The appropriate layout segment is referenced and returned to the caller.
@@ -1450,7 +1470,8 @@ lookup_again:
 	}
 
 	/* if LAYOUTGET already failed once we don't try again */
-	if (pnfs_layout_io_test_failed(lo, iomode))
+	if (pnfs_layout_io_test_failed(lo, iomode) &&
+	    !pnfs_should_retry_layoutget(lo))
 		goto out_unlock;
 
 	first = list_empty(&lo->plh_segs);
@@ -1475,6 +1496,22 @@ lookup_again:
 			goto out_unlock;
 	}
 
+	/*
+	 * Because we free lsegs before sending LAYOUTRETURN, we need to wait
+	 * for LAYOUTRETURN even if first is true.
+	 */
+	if (!lseg && pnfs_should_retry_layoutget(lo) &&
+	    test_bit(NFS_LAYOUT_RETURN, &lo->plh_flags)) {
+		spin_unlock(&ino->i_lock);
+		dprintk("%s wait for layoutreturn\n", __func__);
+		if (pnfs_prepare_to_retry_layoutget(lo)) {
+			pnfs_put_layout_hdr(lo);
+			dprintk("%s retrying\n", __func__);
+			goto lookup_again;
+		}
+		goto out_put_layout_hdr;
+	}
+
 	if (pnfs_layoutgets_blocked(lo, &arg, 0))
 		goto out_unlock;
 	atomic_inc(&lo->plh_outstanding);
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h
index 67a436b..c2b4328 100644
--- a/fs/nfs/pnfs.h
+++ b/fs/nfs/pnfs.h
@@ -358,8 +358,11 @@ static inline void pnfs_set_retry_layoutget(struct pnfs_layout_hdr *lo)
 
 static inline void pnfs_clear_retry_layoutget(struct pnfs_layout_hdr *lo)
 {
-	if (test_and_clear_bit(NFS_LAYOUT_RETRY_LAYOUTGET, &lo->plh_flags))
+	if (test_and_clear_bit(NFS_LAYOUT_RETRY_LAYOUTGET, &lo->plh_flags)) {
 		atomic_dec(&lo->plh_refcount);
+		/* wake up waiters for LAYOUTRETURN as that is not needed */
+		wake_up_bit(&lo->plh_flags, NFS_LAYOUT_RETURN);
+	}
 }
 
 static inline bool pnfs_should_retry_layoutget(struct pnfs_layout_hdr *lo)
-- 
1.9.3


  parent reply	other threads:[~2014-12-16 19:03 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-16 19:01 [PATCH 00/50] *** Add Flexfile Layout Module *** Tom Haynes
2014-12-16 19:01 ` [PATCH 01/50] pnfs: Prepare for flexfiles by pulling out common code Tom Haynes
2014-12-16 19:56   ` Anna Schumaker
2014-12-16 20:32     ` Tom Haynes
2014-12-16 20:35       ` Tom Haynes
2014-12-16 19:01 ` [PATCH 02/50] pnfs: Do not grab the commit_info lock twice when rescheduling writes Tom Haynes
2014-12-16 19:01 ` [PATCH 03/50] nfs41: pull data server cache from file layout to generic pnfs Tom Haynes
2014-12-16 19:01 ` [PATCH 04/50] nfs41: pull nfs4_ds_connect " Tom Haynes
2014-12-16 19:01 ` [PATCH 05/50] nfs41: pull decode_ds_addr " Tom Haynes
2014-12-16 19:01 ` [PATCH 06/50] nfs41: allow LD to choose DS connection auth flavor Tom Haynes
2014-12-16 19:01 ` [PATCH 07/50] nfs41: move file layout macros to generic pnfs Tom Haynes
2014-12-16 19:01 ` [PATCH 08/50] nfsv3: introduce nfs3_set_ds_client Tom Haynes
2014-12-16 20:35   ` Anna Schumaker
2014-12-16 21:55     ` Tom Haynes
2014-12-22  2:22     ` Peng Tao
2014-12-16 19:01 ` [PATCH 09/50] nfs41: allow LD to choose DS connection version/minor_version Tom Haynes
2014-12-16 19:01 ` [PATCH 10/50] nfs41: create NFSv3 DS connection if specified Tom Haynes
2014-12-16 19:01 ` [PATCH 11/50] pnfs: Add nfs_rpc_ops in calls to nfs_initiate_pgio Tom Haynes
2014-12-16 19:01 ` [PATCH 12/50] nfs: allow different protocol in nfs_initiate_commit Tom Haynes
2014-12-16 19:01 ` [PATCH 13/50] nfs4: pass slot table to nfs40_setup_sequence Tom Haynes
2014-12-16 19:01 ` [PATCH 14/50] nfs4: export nfs4_sequence_done Tom Haynes
2014-12-16 19:01 ` [PATCH 15/50] nfs: allow to specify cred in nfs_initiate_pgio Tom Haynes
2014-12-16 19:01 ` [PATCH 16/50] NFSv4.1/NFSv3: Add pNFS callbacks for nfs3_(read|write|commit)_done() Tom Haynes
2014-12-16 19:01 ` [PATCH 17/50] sunrpc: add rpc_count_iostats_idx Tom Haynes
2014-12-16 19:01 ` [PATCH 18/50] nfs: set hostname when creating nfsv3 ds connection Tom Haynes
2014-12-16 19:01 ` [PATCH 19/50] nfs/flexclient: export pnfs_layoutcommit_inode Tom Haynes
2014-12-16 19:01 ` [PATCH 20/50] nfs41: close a small race window when adding new layout to global list Tom Haynes
2014-12-16 19:01 ` [PATCH 21/50] nfs41: serialize first layoutget of a file Tom Haynes
2014-12-16 19:01 ` [PATCH 22/50] nfs: save server READ/WRITE/COMMIT status Tom Haynes
2014-12-16 19:01 ` [PATCH 23/50] nfs41: pass iomode through layoutreturn args Tom Haynes
2014-12-16 19:01 ` [PATCH 24/50] nfs41: make a helper function to send layoutreturn Tom Haynes
2014-12-16 19:01 ` [PATCH 25/50] nfs41: add a helper to mark layout for return Tom Haynes
2014-12-16 19:01 ` [PATCH 26/50] nfs41: don't use a layout if it is marked for returning Tom Haynes
2014-12-16 19:01 ` [PATCH 27/50] nfs41: send layoutreturn in last put_lseg Tom Haynes
2014-12-16 19:01 ` [PATCH 28/50] nfs41: clear NFS_LAYOUT_RETURN if layoutreturn is sent or failed to send Tom Haynes
2014-12-16 19:01 ` [PATCH 29/50] nfs/filelayout: use pnfs_error_mark_layout_for_return Tom Haynes
2014-12-16 19:01 ` [PATCH 30/50] nfs: introduce pg_cleanup op for pgio descriptors Tom Haynes
2014-12-16 19:01 ` [PATCH 31/50] pnfs: release lseg in pnfs_generic_pg_cleanup Tom Haynes
2014-12-16 19:01 ` [PATCH 32/50] nfs: handle overlapping reqs in lock_and_join Tom Haynes
2014-12-16 19:01 ` [PATCH 33/50] nfs: rename pgio header ds_idx to ds_commit_idx Tom Haynes
2014-12-16 19:01 ` [PATCH 34/50] pnfs: pass ds_commit_idx through the commit path Tom Haynes
2014-12-16 19:01 ` [PATCH 35/50] nfs: add mirroring support to pgio layer Tom Haynes
2014-12-16 19:01 ` [PATCH 36/50] nfs: mirroring support for direct io Tom Haynes
2014-12-16 19:01 ` [PATCH 37/50] pnfs: fail comparison when bucket verifier not set Tom Haynes
2014-12-16 19:01 ` [PATCH 38/50] nfs41: add a debug warning if we destroy an unempty layout Tom Haynes
2014-12-16 21:03   ` Anna Schumaker
2014-12-22  2:06     ` Peng Tao
2014-12-16 19:01 ` [PATCH 39/50] nfs/flexfiles: send layoutreturn before freeing lseg Tom Haynes
2014-12-16 21:12   ` Anna Schumaker
2014-12-16 22:02     ` Tom Haynes
2014-12-17 14:44       ` Anna Schumaker
2014-12-16 19:01 ` [PATCH 40/50] nfs: only reset desc->pg_mirror_idx when mirroring is supported Tom Haynes
2014-12-16 19:01 ` [PATCH 41/50] nfs: add nfs_pgio_current_mirror helper Tom Haynes
2014-12-16 19:01 ` [PATCH 42/50] pnfs: allow LD to ask to resend read through pnfs Tom Haynes
2014-12-16 19:01 ` [PATCH 43/50] nfs41: add range to layoutreturn args Tom Haynes
2014-12-16 19:01 ` [PATCH 44/50] nfs41: allow async version layoutreturn Tom Haynes
2014-12-16 19:01 ` [PATCH 45/50] nfs41: introduce NFS_LAYOUT_RETURN_BEFORE_CLOSE Tom Haynes
2014-12-16 19:01 ` [PATCH 46/50] nfs/flexfiles: defer sending layoutreturn in pnfs_put_lseg Tom Haynes
2014-12-16 19:01 ` [PATCH 47/50] nfs41: add NFS_LAYOUT_RETRY_LAYOUTGET to layout header flags Tom Haynes
2014-12-16 19:01 ` [PATCH 48/50] nfs: add a helper to set NFS_ODIRECT_RESCHED_WRITES to direct writes Tom Haynes
2014-12-16 19:01 ` Tom Haynes [this message]
2014-12-16 19:01 ` [PATCH 50/50] pnfs/flexfiles: Add the FlexFile Layout Driver Tom Haynes
2014-12-16 19:36 ` [PATCH 00/50] *** Add Flexfile Layout Module *** Anna Schumaker
2014-12-16 20:33   ` Tom Haynes
2014-12-16 20:48     ` Tom Haynes
2014-12-16 20:40 ` J. Bruce Fields
2014-12-16 20:45   ` Tom Haynes
2014-12-16 20:53 ` Anna Schumaker
2014-12-16 21:03   ` Tom Haynes

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1418756513-95187-50-git-send-email-loghyr@primarydata.com \
    --to=thomas.haynes@primarydata.com \
    --cc=Trond.Myklebust@primarydata.com \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.