Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp3274643pxp; Tue, 22 Mar 2022 16:12:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJywBJKzNJ0gbTvk7Ve34AOJNzlwxStwhmlhX0ABCnYM5EfDHxLxL9PF5OGaLVmCNU635T0x X-Received: by 2002:a17:907:3f9c:b0:6d8:116d:476b with SMTP id hr28-20020a1709073f9c00b006d8116d476bmr27921271ejc.432.1647990726967; Tue, 22 Mar 2022 16:12:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647990726; cv=none; d=google.com; s=arc-20160816; b=O75YMPdoAfHfynJT57hTHuP6VBTagkrvqMku9gRDB/1i7oLc1qjE+Zk9VPQPgh/pvT PCFJWauHfOHSufbAnUyiDzo2gc0qPZHVRo7CvNDTR6gtOJV6cMAI+R2fC+zVvhLjFC71 TSJQ0ICCfegbrRXLWZ6dEgYilUMths6a6bVcEfZ6Y48V62t7ZWlotZrvM3eiDLkuQYQM WQ+M4FMfDxBdoJeIzfSB6W73gTrtc6qD2sF5LEoWZEZTInivK5pxY8aSgTo5GwiR32BU 3npwOrZSQYBYwFjlbinK8OCreflI1PAMbLvrzy03Ij+z1ann008P6h1DGovJyWt3spd3 mNtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature:dkim-filter; bh=4zP0pIJc2qHmjGMC2LudiwpznnevC8oMBvzNghI9J/M=; b=jrMFSpfECV38eciNGA+VB5BIgYAsYiHZ0jS3ExaFlo8S+Q+wQveig9rSbtNd83PI2g EJBEgJRAW0GscgiGD9VQByBaa1vXAg+ujOZKkdDn0JC1h0rKvQTw4MZHyYIIQ6agpVjQ R3JMWREUhW2bqfzBldnOalHygJL+IVU/1kKsQJBOa0aR1yVMAsEkI2qMuObhksJwCBQb gsFgDZytTFOuA/a19W19o8XjsZTHbhSS8DFIgdz5R7Gj/tbazZEng5UjCLjnSQMvSWmW j0sEdxbVJJ5iUHBfbqMtCBN0emGOyEbfb2dWv0z1J2PkwUrUJGILBMt8fkNka0MGqunj HF1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@fieldses.org header.s=default header.b=yDmrwKUu; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 23-20020a170906029700b006df76385dc7si10876868ejf.615.2022.03.22.16.11.29; Tue, 22 Mar 2022 16:12:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@fieldses.org header.s=default header.b=yDmrwKUu; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236933AbiCVVwM (ORCPT + 99 others); Tue, 22 Mar 2022 17:52:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236941AbiCVVvw (ORCPT ); Tue, 22 Mar 2022 17:51:52 -0400 Received: from fieldses.org (fieldses.org [IPv6:2600:3c00:e000:2f7::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 01672674F5; Tue, 22 Mar 2022 14:50:23 -0700 (PDT) Received: by fieldses.org (Postfix, from userid 2815) id 2665F72C6; Tue, 22 Mar 2022 17:50:23 -0400 (EDT) DKIM-Filter: OpenDKIM Filter v2.11.0 fieldses.org 2665F72C6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fieldses.org; s=default; t=1647985823; bh=4zP0pIJc2qHmjGMC2LudiwpznnevC8oMBvzNghI9J/M=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=yDmrwKUu4+QOMjJc9xt/C9ApF8Uzgl5wD3s50a5mCA0ny5GZ0xP63Wb7ebcnNqgDI lVas4m2PyegIQFpUWb5MVJGZgGtsNEIeK/bHncSWRn1fljRfRCOUJdNhMx8v06zx53 qzmlqsCi+gr3f4EjdJ/TzpnQwAwB4L3EiBqAsn4s= Date: Tue, 22 Mar 2022 17:50:23 -0400 From: "J. Bruce Fields" To: Dai Ngo Cc: chuck.lever@oracle.com, jlayton@redhat.com, viro@zeniv.linux.org.uk, linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH RFC v17 06/11] NFSD: Update find_clp_in_name_tree() to handle courtesy client Message-ID: <20220322215023.GA13980@fieldses.org> References: <1647503028-11966-1-git-send-email-dai.ngo@oracle.com> <1647503028-11966-7-git-send-email-dai.ngo@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1647503028-11966-7-git-send-email-dai.ngo@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On Thu, Mar 17, 2022 at 12:43:43AM -0700, Dai Ngo wrote: > Update find_clp_in_name_tree to check and expire courtesy client. > > Update find_confirmed_client_by_name to discard the courtesy > client by setting CLIENT_EXPIRED. > > Update nfsd4_setclientid to expire client with CLIENT_EXPIRED > state to prevent multiple confirmed clients with the same name > on the conf_id_hashtbl list. I could use a little more "why" here. I'll give it another read, but right now I'm just not understanding how this is meant to work. --b. > > Signed-off-by: Dai Ngo > --- > fs/nfsd/nfs4state.c | 27 ++++++++++++++++++++++++--- > fs/nfsd/state.h | 22 ++++++++++++++++++++++ > 2 files changed, 46 insertions(+), 3 deletions(-) > > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index c6b5e05c9c34..dc0e60bf694c 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -2834,8 +2834,11 @@ find_clp_in_name_tree(struct xdr_netobj *name, struct rb_root *root) > node = node->rb_left; > else if (cmp < 0) > node = node->rb_right; > - else > + else { > + if (nfsd4_courtesy_clnt_expired(clp)) > + return NULL; > return clp; > + } > } > return NULL; > } > @@ -2914,8 +2917,15 @@ static bool clp_used_exchangeid(struct nfs4_client *clp) > static struct nfs4_client * > find_confirmed_client_by_name(struct xdr_netobj *name, struct nfsd_net *nn) > { > + struct nfs4_client *clp; > + > lockdep_assert_held(&nn->client_lock); > - return find_clp_in_name_tree(name, &nn->conf_name_tree); > + clp = find_clp_in_name_tree(name, &nn->conf_name_tree); > + if (clp && clp->cl_cs_client_state == NFSD4_CLIENT_RECONNECTED) { > + nfsd4_discard_courtesy_clnt(clp); > + clp = NULL; > + } > + return clp; > } > > static struct nfs4_client * > @@ -4032,12 +4042,19 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, > struct nfs4_client *unconf = NULL; > __be32 status; > struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); > + struct nfs4_client *cclient = NULL; > > new = create_client(clname, rqstp, &clverifier); > if (new == NULL) > return nfserr_jukebox; > spin_lock(&nn->client_lock); > - conf = find_confirmed_client_by_name(&clname, nn); > + /* find confirmed client by name */ > + conf = find_clp_in_name_tree(&clname, &nn->conf_name_tree); > + if (conf && conf->cl_cs_client_state == NFSD4_CLIENT_RECONNECTED) { > + cclient = conf; > + conf = NULL; > + } > + > if (conf && client_has_state(conf)) { > status = nfserr_clid_inuse; > if (clp_used_exchangeid(conf)) > @@ -4068,7 +4085,11 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, > new = NULL; > status = nfs_ok; > out: > + if (cclient) > + unhash_client_locked(cclient); > spin_unlock(&nn->client_lock); > + if (cclient) > + expire_client(cclient); > if (new) > free_client(new); > if (unconf) { > diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h > index d156ae3ab46c..14b2c158ccca 100644 > --- a/fs/nfsd/state.h > +++ b/fs/nfsd/state.h > @@ -735,6 +735,7 @@ extern void nfsd4_client_record_remove(struct nfs4_client *clp); > extern int nfsd4_client_record_check(struct nfs4_client *clp); > extern void nfsd4_record_grace_done(struct nfsd_net *nn); > > +/* courteous server */ > static inline bool > nfsd4_expire_courtesy_clnt(struct nfs4_client *clp) > { > @@ -749,4 +750,25 @@ nfsd4_expire_courtesy_clnt(struct nfs4_client *clp) > return rc; > } > > +static inline void > +nfsd4_discard_courtesy_clnt(struct nfs4_client *clp) > +{ > + spin_lock(&clp->cl_cs_lock); > + clp->cl_cs_client_state = NFSD4_CLIENT_EXPIRED; > + spin_unlock(&clp->cl_cs_lock); > +} > + > +static inline bool > +nfsd4_courtesy_clnt_expired(struct nfs4_client *clp) > +{ > + bool rc = false; > + > + spin_lock(&clp->cl_cs_lock); > + if (clp->cl_cs_client_state == NFSD4_CLIENT_EXPIRED) > + rc = true; > + if (clp->cl_cs_client_state == NFSD4_CLIENT_COURTESY) > + clp->cl_cs_client_state = NFSD4_CLIENT_RECONNECTED; > + spin_unlock(&clp->cl_cs_lock); > + return rc; > +} > #endif /* NFSD4_STATE_H */ > -- > 2.9.5