public inbox for linux-nfs@vger.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: linux-nfs@vger.kernel.org
Cc: "J. Bruce Fields" <bfields@citi.umich.edu>
Subject: [PATCH] nfsd4: create rpc callback client from server thread
Date: Sun,  3 May 2009 14:16:32 -0400	[thread overview]
Message-ID: <1241374599-20348-7-git-send-email-bfields@fieldses.org> (raw)
In-Reply-To: <1241374599-20348-6-git-send-email-bfields@fieldses.org>

From: J. Bruce Fields <bfields@citi.umich.edu>

The code is a little simpler, and it should be easier to avoid races, if
we just do all rpc client creation/destruction from nfsd or laundromat
threads and do only the rpc calls themselves asynchronously.  The rpc
creation doesn't involve any significant waiting (it doesn't call the
client, for example), so there's no reason not to do this.

Also don't bother destroying the client on failure of the rpc null
probe.  We may want to retry the probe later anyway.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
---
 fs/nfsd/nfs4callback.c |   31 ++++++++++++++++---------------
 1 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 4788d09..711c628 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -409,6 +409,12 @@ int setup_callback_client(struct nfs4_client *clp)
 
 }
 
+static void warn_no_callback_path(struct nfs4_client *clp, int reason)
+{
+	dprintk("NFSD: warning: no callback path to client %.*s: error %d\n",
+		(int)clp->cl_name.len, clp->cl_name.data, reason);
+}
+
 static int do_probe_callback(void *data)
 {
 	struct nfs4_client *clp = data;
@@ -419,24 +425,12 @@ static int do_probe_callback(void *data)
 	};
 	int status;
 
-	status = setup_callback_client(clp);
-	if (status)
-		goto out_err;
-
 	status = rpc_call_sync(cb->cb_client, &msg, RPC_TASK_SOFT);
-
 	if (status)
-		goto out_release_client;
+		warn_no_callback_path(clp, status);
+	else
+		atomic_set(&cb->cb_set, 1);
 
-	atomic_set(&cb->cb_set, 1);
-	put_nfs4_client(clp);
-	return 0;
-out_release_client:
-	rpc_shutdown_client(cb->cb_client);
-	cb->cb_client = NULL;
-out_err:
-	dprintk("NFSD: warning: no callback path to client %.*s: error %d\n",
-		(int)clp->cl_name.len, clp->cl_name.data, status);
 	put_nfs4_client(clp);
 	return 0;
 }
@@ -448,9 +442,16 @@ void
 nfsd4_probe_callback(struct nfs4_client *clp)
 {
 	struct task_struct *t;
+	int status;
 
 	BUG_ON(atomic_read(&clp->cl_callback.cb_set));
 
+	status = setup_callback_client(clp);
+	if (status) {
+		warn_no_callback_path(clp, status);
+		return;
+	}
+
 	/* the task holds a reference to the nfs4_client struct */
 	atomic_inc(&clp->cl_count);
 
-- 
1.6.0.4


  reply	other threads:[~2009-05-03 18:16 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-03 18:16 misc (mostly callback) patches for 2.6.31 J. Bruce Fields
2009-05-03 18:16 ` [PATCH] nfsd4: rename callback struct to cb_conn J. Bruce Fields
2009-05-03 18:16   ` [PATCH] nfsd: quiet compile warning J. Bruce Fields
2009-05-03 18:16     ` [PATCH] nfsd4: setclientid_confirm callback-change fixes J. Bruce Fields
2009-05-03 18:16       ` [PATCH] nfsd4: set shorter timeout J. Bruce Fields
2009-05-03 18:16         ` [PATCH] nfsd4: set cb_client inside setup_callback_client J. Bruce Fields
2009-05-03 18:16           ` J. Bruce Fields [this message]
2009-05-03 18:16             ` [PATCH] nfsd4: lookup up callback cred only once J. Bruce Fields
2009-05-03 18:16               ` [PATCH] nfsd4: replace callback thread by asynchronous rpc J. Bruce Fields
2009-05-03 18:16                 ` [PATCH] nfsd4: rename callback struct to cb_conn J. Bruce Fields
2009-05-03 18:16                   ` [PATCH] nfsd4: eliminate struct nfs4_cb_recall J. Bruce Fields
2009-05-03 18:16                     ` [PATCH] nfsd4: remove unused dl_trunc J. Bruce Fields
2009-05-03 18:16                       ` [PATCH] nfsd4: track recall retries in nfs4_delegation J. Bruce Fields
2009-05-03 18:16                         ` [PATCH] nfsd4: make recall callback an asynchronous rpc 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=1241374599-20348-7-git-send-email-bfields@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=bfields@citi.umich.edu \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox