All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@primarydata.com>
To: bfields@fieldses.org
Cc: linux-nfs@vger.kernel.org, hch@infradead.org
Subject: [PATCH 8/7] nfsd: Convert delegation counter to an atomic_long_t type
Date: Wed, 16 Jul 2014 08:37:15 -0400	[thread overview]
Message-ID: <1405514235-24019-1-git-send-email-jlayton@primarydata.com> (raw)
In-Reply-To: <1405420669-4030-1-git-send-email-jlayton@primarydata.com>

From: Trond Myklebust <trond.myklebust@primarydata.com>

We want to convert to an atomic type so that we don't need to lock
across the call to alloc_init_deleg(). Then convert to a long type so
that we match the size of 'max_delegations'.

None of this is a problem today, but it will be once we remove
client_mutex protection.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
---
 fs/nfsd/nfs4state.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 34235475e8d6..243e091fda6c 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -343,7 +343,7 @@ find_any_file(struct nfs4_file *f)
 	return ret;
 }
 
-static int num_delegations;
+static atomic_long_t num_delegations;
 unsigned long max_delegations;
 
 /*
@@ -571,22 +571,23 @@ static struct nfs4_delegation *
 alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct svc_fh *current_fh)
 {
 	struct nfs4_delegation *dp;
+	long n;
 
 	dprintk("NFSD alloc_init_deleg\n");
-	if (num_delegations > max_delegations)
-		return NULL;
+	n = atomic_long_inc_return(&num_delegations);
+	if (n < 0 || n > max_delegations)
+		goto out_dec;
 	if (delegation_blocked(&current_fh->fh_handle))
-		return NULL;
+		goto out_dec;
 	dp = delegstateid(nfs4_alloc_stid(clp, deleg_slab));
 	if (dp == NULL)
-		return dp;
+		goto out_dec;
 	/*
 	 * delegation seqid's are never incremented.  The 4.1 special
 	 * meaning of seqid 0 isn't meaningful, really, but let's avoid
 	 * 0 anyway just for consistency and use 1:
 	 */
 	dp->dl_stid.sc_stateid.si_generation = 1;
-	num_delegations++;
 	INIT_LIST_HEAD(&dp->dl_perfile);
 	INIT_LIST_HEAD(&dp->dl_perclnt);
 	INIT_LIST_HEAD(&dp->dl_recall_lru);
@@ -594,6 +595,9 @@ alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct sv
 	fh_copy_shallow(&dp->dl_fh, &current_fh->fh_handle);
 	INIT_WORK(&dp->dl_recall.cb_work, nfsd4_run_cb_recall);
 	return dp;
+out_dec:
+	atomic_long_dec(&num_delegations);
+	return NULL;
 }
 
 static void remove_stid(struct nfs4_stid *s)
@@ -616,7 +620,7 @@ nfs4_put_delegation(struct nfs4_delegation *dp)
 		if (dp->dl_file)
 			put_nfs4_file(dp->dl_file);
 		nfs4_free_stid(deleg_slab, &dp->dl_stid);
-		num_delegations--;
+		atomic_long_dec(&num_delegations);
 	}
 }
 
-- 
1.9.3


      parent reply	other threads:[~2014-07-16 12:37 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-15 10:37 [PATCH 0/7] nfsd: more delegation fixes to prepare for client_mutex removal Jeff Layton
2014-07-15 10:37 ` [PATCH 1/7] nfsd: nfs4_alloc_init_lease should take a nfs4_file arg Jeff Layton
2014-07-15 16:24   ` Christoph Hellwig
2014-07-15 10:37 ` [PATCH 2/7] nfsd: Ensure stateids remain unique until they are freed Jeff Layton
2014-07-15 17:15   ` Christoph Hellwig
2014-07-16 12:17     ` Jeff Layton
2014-07-16 13:49       ` Christoph Hellwig
2014-07-16 14:28         ` Jeff Layton
2014-07-16 14:29           ` Christoph Hellwig
2014-07-16 14:34             ` Jeff Layton
2014-07-15 10:37 ` [PATCH 3/7] locks: add file_has_lease to prevent delegation break races Jeff Layton
2014-07-15 17:17   ` Christoph Hellwig
2014-07-15 17:31     ` Jeff Layton
2014-07-15 10:37 ` [PATCH 4/7] nfsd: Protect the nfs4_file delegation fields using the fi_lock Jeff Layton
2014-07-15 10:37 ` [PATCH 5/7] nfsd: Move the delegation reference counter into the struct nfs4_stid Jeff Layton
2014-07-16  9:37   ` Christoph Hellwig
2014-07-15 10:37 ` [PATCH 6/7] nfsd: Simplify stateid management Jeff Layton
2014-07-15 10:37 ` [PATCH 7/7] nfsd: Fix delegation revocation Jeff Layton
2014-07-15 16:24 ` [PATCH 0/7] nfsd: more delegation fixes to prepare for client_mutex removal Christoph Hellwig
2014-07-16 12:37 ` Jeff Layton [this message]

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=1405514235-24019-1-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.