All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@primarydata.com>
To: bfields@fieldses.org
Cc: hch@infradead.org, linux-nfs@vger.kernel.org
Subject: [PATCH v4 09/10] nfsd: clean up nfs4_set_delegation
Date: Fri, 18 Jul 2014 11:13:35 -0400	[thread overview]
Message-ID: <1405696416-32585-10-git-send-email-jlayton@primarydata.com> (raw)
In-Reply-To: <1405696416-32585-1-git-send-email-jlayton@primarydata.com>

Move the alloc_init_deleg call into nfs4_set_delegation and change the
function to return a pointer to the delegation or an IS_ERR return. This
allows us to skip allocating a delegation if the file has already
experienced a lease conflict.

Signed-off-by: Jeff Layton <jlayton@primarydata.com>
---
 fs/nfsd/nfs4state.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 1834d9bd5935..a2c6c85adfc7 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3553,12 +3553,20 @@ out_fput:
 	return status;
 }
 
-static int nfs4_set_delegation(struct nfs4_delegation *dp, struct nfs4_file *fp)
+static struct nfs4_delegation *
+nfs4_set_delegation(struct nfs4_client *clp, struct svc_fh *fh,
+		    struct nfs4_file *fp)
 {
-	int status = 0;
+	int status;
+	struct nfs4_delegation *dp;
 
 	if (fp->fi_had_conflict)
-		return -EAGAIN;
+		return ERR_PTR(-EAGAIN);
+
+	dp = alloc_init_deleg(clp, fh);
+	if (!dp)
+		return ERR_PTR(-ENOMEM);
+
 	get_nfs4_file(fp);
 	spin_lock(&state_lock);
 	spin_lock(&fp->fi_lock);
@@ -3566,7 +3574,8 @@ static int nfs4_set_delegation(struct nfs4_delegation *dp, struct nfs4_file *fp)
 	if (!fp->fi_lease) {
 		spin_unlock(&fp->fi_lock);
 		spin_unlock(&state_lock);
-		return nfs4_setlease(dp);
+		status = nfs4_setlease(dp);
+		goto out;
 	}
 	atomic_inc(&fp->fi_delegees);
 	if (fp->fi_had_conflict) {
@@ -3574,10 +3583,16 @@ static int nfs4_set_delegation(struct nfs4_delegation *dp, struct nfs4_file *fp)
 		goto out_unlock;
 	}
 	hash_delegation_locked(dp, fp);
+	status = 0;
 out_unlock:
 	spin_unlock(&fp->fi_lock);
 	spin_unlock(&state_lock);
-	return status;
+out:
+	if (status) {
+		nfs4_put_delegation(dp);
+		return ERR_PTR(status);
+	}
+	return dp;
 }
 
 static void nfsd4_open_deleg_none_ext(struct nfsd4_open *open, int status)
@@ -3651,12 +3666,9 @@ nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open,
 		default:
 			goto out_no_deleg;
 	}
-	dp = alloc_init_deleg(clp, fh);
-	if (dp == NULL)
+	dp = nfs4_set_delegation(clp, fh, stp->st_file);
+	if (IS_ERR(dp))
 		goto out_no_deleg;
-	status = nfs4_set_delegation(dp, stp->st_file);
-	if (status)
-		goto out_free;
 
 	memcpy(&open->op_delegate_stateid, &dp->dl_stid.sc_stateid, sizeof(dp->dl_stid.sc_stateid));
 
@@ -3664,8 +3676,6 @@ nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open,
 		STATEID_VAL(&dp->dl_stid.sc_stateid));
 	open->op_delegate_type = NFS4_OPEN_DELEGATE_READ;
 	return;
-out_free:
-	nfs4_put_delegation(dp);
 out_no_deleg:
 	open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE;
 	if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS &&
-- 
1.9.3


  parent reply	other threads:[~2014-07-18 15:13 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-18 15:13 [PATCH v4 00/10] nfsd: more delegation fixes to prepare for client_mutex removal Jeff Layton
2014-07-18 15:13 ` [PATCH v4 01/10] nfsd: Protect the nfs4_file delegation fields using the fi_lock Jeff Layton
2014-07-18 15:54   ` Christoph Hellwig
2014-07-18 18:46     ` Jeff Layton
2014-07-18 16:28   ` J. Bruce Fields
2014-07-18 17:31     ` Jeff Layton
2014-07-18 17:49       ` J. Bruce Fields
2014-07-18 19:04         ` Jeff Layton
2014-07-18 19:21           ` J. Bruce Fields
2014-07-18 19:32             ` Jeff Layton
2014-07-18 19:35               ` J. Bruce Fields
2014-07-21 21:05             ` J. Bruce Fields
2014-07-21 21:12               ` Jeff Layton
2014-07-18 15:13 ` [PATCH v4 02/10] nfsd: Move the delegation reference counter into the struct nfs4_stid Jeff Layton
2014-07-18 15:13 ` [PATCH v4 03/10] nfsd: simplify stateid allocation and file handling Jeff Layton
2014-07-18 15:55   ` Christoph Hellwig
2014-07-18 15:13 ` [PATCH v4 04/10] nfsd: Fix delegation revocation Jeff Layton
2014-07-18 16:44   ` J. Bruce Fields
2014-07-18 17:24     ` Jeff Layton
2014-07-18 15:13 ` [PATCH v4 05/10] nfsd: ensure that clp->cl_revoked list is protected by clp->cl_lock Jeff Layton
2014-07-18 15:57   ` Christoph Hellwig
2014-07-18 15:13 ` [PATCH v4 06/10] nfsd: Convert delegation counter to an atomic_long_t type Jeff Layton
2014-07-18 15:13 ` [PATCH v4 07/10] nfsd: drop unused stp arg to alloc_init_deleg Jeff Layton
2014-07-18 15:57   ` Christoph Hellwig
2014-07-18 15:13 ` [PATCH v4 08/10] nfsd: clean up arguments to nfs4_open_delegation Jeff Layton
2014-07-18 15:57   ` Christoph Hellwig
2014-07-18 15:13 ` Jeff Layton [this message]
2014-07-18 17:19   ` [PATCH v4 09/10] nfsd: clean up nfs4_set_delegation Christoph Hellwig
2014-07-18 17:23     ` Jeff Layton
2014-07-18 15:13 ` [PATCH v4 10/10] nfsd: give block_delegation and delegation_blocked its own spinlock Jeff Layton
2014-07-18 17:24   ` Christoph Hellwig
2014-07-21  7:02   ` NeilBrown
2014-07-21 11:44     ` Jeff Layton
2014-07-21 13:11       ` J. Bruce Fields
2014-07-21 13:23         ` Jeff Layton
2014-07-21 20:40       ` NeilBrown
2014-07-21 21:17         ` J. Bruce Fields
2014-07-21 22:50           ` NeilBrown
2014-07-22 15:00             ` J. Bruce Fields

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=1405696416-32585-10-git-send-email-jlayton@primarydata.com \
    --to=jlayton@primarydata.com \
    --cc=bfields@fieldses.org \
    --cc=hch@infradead.org \
    --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.