From: Dai Ngo <dai.ngo@oracle.com>
To: chuck.lever@oracle.com, bfields@fieldses.org
Cc: jlayton@redhat.com, viro@zeniv.linux.org.uk,
linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [PATCH RFC v15 08/11] NFSD: Update find_client_in_id_table() to handle courtesy clients
Date: Fri, 4 Mar 2022 16:37:10 -0800 [thread overview]
Message-ID: <1646440633-3542-9-git-send-email-dai.ngo@oracle.com> (raw)
In-Reply-To: <1646440633-3542-1-git-send-email-dai.ngo@oracle.com>
Update find_client_in_id_table to:
. skip client with CLIENT_EXPIRED; discarded courtesy client
. if courtesy client was found then clear CLIENT_COURTESY and set
CLIENT_RECONNECTED flag so callers can take appropriate action.
Update find_confirmed_client to discard courtesy client.
Update lookup_clientid to call find_client_in_id_table directly.
Update set_client to create client record for courtesy client.
Update find_cpntf_state to discard courtesy client.
Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
---
fs/nfsd/nfs4state.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 34a59c6f446c..4a5276696afe 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2921,6 +2921,8 @@ find_client_in_id_table(struct list_head *tbl, clientid_t *clid, bool sessions)
if (same_clid(&clp->cl_clientid, clid)) {
if ((bool)clp->cl_minorversion != sessions)
return NULL;
+ if (nfs4_is_courtesy_client_expired(clp))
+ continue;
renew_client_locked(clp);
return clp;
}
@@ -2932,9 +2934,15 @@ static struct nfs4_client *
find_confirmed_client(clientid_t *clid, bool sessions, struct nfsd_net *nn)
{
struct list_head *tbl = nn->conf_id_hashtbl;
+ struct nfs4_client *clp;
lockdep_assert_held(&nn->client_lock);
- return find_client_in_id_table(tbl, clid, sessions);
+ clp = find_client_in_id_table(tbl, clid, sessions);
+ if (clp && test_bit(NFSD4_CLIENT_RECONNECTED, &clp->cl_flags)) {
+ nfsd4_discard_courtesy_clnt(clp);
+ clp = NULL;
+ }
+ return clp;
}
static struct nfs4_client *
@@ -4873,9 +4881,10 @@ static struct nfs4_client *lookup_clientid(clientid_t *clid, bool sessions,
struct nfsd_net *nn)
{
struct nfs4_client *found;
+ struct list_head *tbl = nn->conf_id_hashtbl;
spin_lock(&nn->client_lock);
- found = find_confirmed_client(clid, sessions, nn);
+ found = find_client_in_id_table(tbl, clid, sessions);
if (found)
atomic_inc(&found->cl_rpc_users);
spin_unlock(&nn->client_lock);
@@ -4900,6 +4909,8 @@ static __be32 set_client(clientid_t *clid,
cstate->clp = lookup_clientid(clid, false, nn);
if (!cstate->clp)
return nfserr_expired;
+ if (test_bit(NFSD4_CLIENT_RECONNECTED, &cstate->clp->cl_flags))
+ nfsd4_client_record_create(cstate->clp);
return nfs_ok;
}
@@ -6219,6 +6230,13 @@ static __be32 find_cpntf_state(struct nfsd_net *nn, stateid_t *st,
found = lookup_clientid(&cps->cp_p_clid, true, nn);
if (!found)
goto out;
+ if (test_bit(NFSD4_CLIENT_RECONNECTED, &found->cl_flags)) {
+ nfsd4_discard_courtesy_clnt(found);
+ if (atomic_dec_and_lock(&found->cl_rpc_users,
+ &nn->client_lock))
+ spin_unlock(&nn->client_lock);
+ goto out;
+ }
*stid = find_stateid_by_type(found, &cps->cp_p_stateid,
NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID);
--
2.9.5
next prev parent reply other threads:[~2022-03-05 0:37 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-05 0:37 [PATCH RFC v15 0/11] NFSD: Initial implementation of NFSv4 Courteous Server Dai Ngo
2022-03-05 0:37 ` [PATCH RFC v15 01/11] fs/lock: add helper locks_any_blockers to check for blockers Dai Ngo
2022-03-09 20:56 ` Chuck Lever III
2022-03-10 3:11 ` dai.ngo
2022-03-10 4:08 ` Chuck Lever III
2022-03-10 4:45 ` dai.ngo
2022-03-05 0:37 ` [PATCH RFC v15 02/11] NFSD: Add client flags, macro and spinlock to support courteous server Dai Ngo
2022-03-05 0:37 ` [PATCH RFC v15 03/11] NFSD: Add lm_lock_expired call out Dai Ngo
2022-03-05 0:37 ` [PATCH RFC v15 04/11] NFSD: Update nfsd_breaker_owns_lease() to handle courtesy clients Dai Ngo
2022-03-09 21:46 ` Chuck Lever III
2022-03-10 5:09 ` dai.ngo
2022-03-10 14:02 ` Chuck Lever III
2022-03-05 0:37 ` [PATCH RFC v15 05/11] NFSD: Update nfs4_get_vfs_file() " Dai Ngo
2022-03-05 0:37 ` [PATCH RFC v15 06/11] NFSD: Update find_clp_in_name_tree() " Dai Ngo
2022-03-09 22:08 ` Chuck Lever III
2022-03-10 3:11 ` dai.ngo
2022-03-05 0:37 ` [PATCH RFC v15 07/11] NFSD: Update find_in_sessionid_hashtbl() " Dai Ngo
2022-03-09 22:42 ` Chuck Lever III
2022-03-10 3:12 ` dai.ngo
2022-03-10 3:33 ` Chuck Lever III
2022-03-10 4:43 ` dai.ngo
2022-03-05 0:37 ` Dai Ngo [this message]
2022-03-05 0:37 ` [PATCH RFC v15 09/11] NFSD: Refactor nfsd4_laundromat() Dai Ngo
2022-03-05 0:37 ` [PATCH RFC v15 10/11] NFSD: Update laundromat to handle courtesy clients Dai Ngo
2022-03-05 0:37 ` [PATCH RFC v15 11/11] NFSD: Show state of courtesy clients in client info Dai Ngo
2022-03-09 20:14 ` Chuck Lever III
2022-03-09 20:51 ` dai.ngo
2022-03-10 3:09 ` dai.ngo
2022-03-10 3:27 ` Chuck Lever III
2022-03-10 15:00 ` Bruce Fields
2022-03-10 17:59 ` dai.ngo
2022-03-10 14:43 ` Chuck Lever III
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=1646440633-3542-9-git-send-email-dai.ngo@oracle.com \
--to=dai.ngo@oracle.com \
--cc=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=jlayton@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/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;
as well as URLs for NNTP newsgroup(s).