Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp991009ybn; Wed, 2 Oct 2019 09:13:21 -0700 (PDT) X-Google-Smtp-Source: APXvYqwW57/zhQ2jLghJ181QBn+McaUntMKpwKZ1ceNJcKYPIRJQvGNIRb/n1nII1hFj9rCOQzU3 X-Received: by 2002:a17:906:19c9:: with SMTP id h9mr3722608ejd.193.1570032801395; Wed, 02 Oct 2019 09:13:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570032801; cv=none; d=google.com; s=arc-20160816; b=UQHMjo/0/Jkh85CHvMaE4tdqEumD59hUaT1Bip3+SNsfvmU+vEkBshvJT2vmu0IcOB Thkbr1ogzYhOqBcLYTAxb+n5Ze7UtutcbQD3XnpU8xiyTVt6j84fWw7A07nMsKHLeLPP bg2+oBtilkDvUhItGkWxgEtF/vhM93r1YhoDPXDjSrYHo9M/xWBPp1DRq7sZ9BA3FjHm ud/X0kYXV0Zs+b5gQyW1v5Na2sRz4XM8CYNXd7F4ndAXFIjU60FK4Q3McZCENLYLj0QD wFXqareO9ASaClY8z3mJ+n1oLbTKuP4Z7ppWeTTtinjZ1ThXIkuVdO8OzBxb0mGGliQd O42A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=g+YJSMPJRH7nOeF8OBD74P5sauFLqufCCpmx4IWND1g=; b=oNvTxTYpOSwSl5B3DkGzaI/ZXacpFwYpGeL2xWumYb1vnplxaCVqPAf2WykdYr1DSZ 80J9BBCRUucE612NCbo8c1CSW6wox8tjHicyFU9urpKEXwFM9X0xo8zlGSzOLJB5Tfwf OFB5sgRhCHfGqcnSTMn5gmhuoGoVChlB73iKADWN0hRU4QafQjutnDsaeUvkgxXz8C4I NG4wibUaa9mZFbBZDJQS99T44Pzix6XIq6rr/I2WAG/MUjeGkWXCW5TnrVUXeoya5n1L B8/Tu4zWjlRPE3PMP9Dq6XZDblI5cZGuilcVRdrVRo3wCsVrLRyLN0xgFMH6/gNcLiQS cIVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=jg0ySS0q; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b12si12871267edk.16.2019.10.02.09.12.48; Wed, 02 Oct 2019 09:13:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=jg0ySS0q; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728696AbfJBPcU (ORCPT + 99 others); Wed, 2 Oct 2019 11:32:20 -0400 Received: from mail-ua1-f68.google.com ([209.85.222.68]:41516 "EHLO mail-ua1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725875AbfJBPcU (ORCPT ); Wed, 2 Oct 2019 11:32:20 -0400 Received: by mail-ua1-f68.google.com with SMTP id l13so6817567uap.8 for ; Wed, 02 Oct 2019 08:32:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=g+YJSMPJRH7nOeF8OBD74P5sauFLqufCCpmx4IWND1g=; b=jg0ySS0qDhbxVJ4D0JncsLkaDZzKTsICwXObdwsFXpVB5EVPkk6ydNEp2M8LGOkGvA esZtgFmCfu9XvO9CtW8TA+JLhHyyT5quT/X7vfAbgEOLdRAO3KB+7TbB+tAz+E47qTQ9 BzJxRGUOfKUe3UTRsj76AzS0H0Q6kWS+jy3E+hTEuWAmiD7PELicV88ymTMu1cNg9ezY mL6JwJvNqUmpv4F08beSB+kMnqojA9R9YhWUHpQWrl897qNGH1GREy27xmsJ1ObTB+dg JGg2KINogM6FiOAHapEnJGRSr160OoiyP2YzsUR6Al3N5SQ1H3tr7eTwTnnbKvlIzlVq R4Mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=g+YJSMPJRH7nOeF8OBD74P5sauFLqufCCpmx4IWND1g=; b=Ff2VwIrtT521NZgVCXDUi7hf8gxPms2kVJJo8CrDTHbWFRFnwXitsw+zYf7BsrGydB 8KsG9sN0EwS1TLYPi6T6AdWyaEHwqiBYIgkjdJEKujiAYMb3sXmLB252z/bEeUnd/bnt ZfvTCgmurUYrl8XohanxUPqd6jUTq5Vjf2kGSklK7MltotN9nvL2Is5xe7WuKcxIqG+f RjPsidE7nNYcQ0ec6J8Pw1MEw1ar6F1pbytaoUWDSbz/auFMNzx7ZSIorqb+21ZEOgt+ wMn/LpEFiba6+dPZkcDhNDUW5346CkqizlgpswPYq5FJK6BlbQBZW/ycbV+mevi8TVl3 KUhQ== X-Gm-Message-State: APjAAAUZ/hEzhDhtep9IwekuJnjYv9n4D7m4s0D9fT1PebqMDuBo6WQV HUgr+aAI4oXNHCf7gzR0gRyPxHxz6z5MaCgMSao= X-Received: by 2002:ab0:1e3:: with SMTP id 90mr1939609ual.93.1570030338821; Wed, 02 Oct 2019 08:32:18 -0700 (PDT) MIME-Version: 1.0 References: <20190916211353.18802-1-olga.kornievskaia@gmail.com> <20190916211353.18802-16-olga.kornievskaia@gmail.com> <20191001205900.GB4926@fieldses.org> <20191002013523.GA9000@fieldses.org> In-Reply-To: <20191002013523.GA9000@fieldses.org> From: Olga Kornievskaia Date: Wed, 2 Oct 2019 11:32:07 -0400 Message-ID: Subject: Re: [PATCH v7 15/19] NFSD add COPY_NOTIFY operation To: "J. Bruce Fields" Cc: trond.myklebust@hammerspace.com, Anna Schumaker , "J. Bruce Fields" , linux-nfs Content-Type: text/plain; charset="UTF-8" Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On Tue, Oct 1, 2019 at 9:35 PM J. Bruce Fields wrote: > > On Tue, Oct 01, 2019 at 08:14:39PM -0400, Olga Kornievskaia wrote: > > On Tue, Oct 1, 2019 at 4:59 PM J. Bruce Fields wrote: > > > > > > On Mon, Sep 16, 2019 at 05:13:49PM -0400, Olga Kornievskaia wrote: > > > > @@ -2914,7 +2983,8 @@ static bool client_has_state(struct nfs4_client *clp) > > > > #endif > > > > || !list_empty(&clp->cl_delegations) > > > > || !list_empty(&clp->cl_sessions) > > > > - || !list_empty(&clp->async_copies); > > > > + || !list_empty(&clp->async_copies) > > > > + || client_has_copy_notifies(clp); > > > > > > Sorry, remind me--how is the copy_notify stateid cleaned up? Is it just > > > timed out by the laundromat thread, or is our client destroying it when > > > the copy is done? > > > > Copy_notify stateid in most cases should be removed by > > nfs4_put_stid()/ the "parent" stateid going away (close, unlock, > > delegreturn) > > Oh, right, the parent stateid going away will be enough, good. > > But doesn't that mean the client_has_copy_notifies() check here is > redundant? If it's true, then the earlier client_has_openowner() check > was also true. Honestly, I didn't remove it because I didn't know if I was missing some weird case where on clientid destruction we'd still have copy notify left and thus need to delay it. But as you see nfs4_put_stid() calls nfs4_free_cpntf_statelist() which iterates the list of the copy_notify states and deletes them. Sounds like I should just remove the client_has_copy_notifies() check. > > --b. > > > (or in unlikely case, if the client sent an > > OFFLOAD_CANCEL to the stateid, say if copy was canceled). Otherwise, > > copy notify stateid will time out and be removed by the laundromat > > thread. So if a client didn't send a close/unlock/delegreturn and > > quickly tries to delete a clientid, it will get ERR_CLID_INUSE but I > > think if there was no close, the server will have an issue of having > > an open stateid state. > > > > > I'm just wondering if this can result in NFSERR_CLID_INUSE just because > > > a copy was done recently. > > > > > > --b. > > > > > > > } > > > > > > > > static __be32 copy_impl_id(struct nfs4_client *clp, > > > > @@ -5192,6 +5262,9 @@ static bool clients_still_reclaiming(struct nfsd_net *nn) > > > > struct list_head *pos, *next, reaplist; > > > > time_t cutoff = get_seconds() - nn->nfsd4_lease; > > > > time_t t, new_timeo = nn->nfsd4_lease; > > > > + struct nfs4_cpntf_state *cps; > > > > + copy_stateid_t *cps_t; > > > > + int i; > > > > > > > > dprintk("NFSD: laundromat service - starting\n"); > > > > > > > > @@ -5202,6 +5275,17 @@ static bool clients_still_reclaiming(struct nfsd_net *nn) > > > > dprintk("NFSD: end of grace period\n"); > > > > nfsd4_end_grace(nn); > > > > INIT_LIST_HEAD(&reaplist); > > > > + > > > > + spin_lock(&nn->s2s_cp_lock); > > > > + idr_for_each_entry(&nn->s2s_cp_stateids, cps_t, i) { > > > > + cps = container_of(cps_t, struct nfs4_cpntf_state, cp_stateid); > > > > + if (cps->cp_stateid.sc_type == NFS4_COPYNOTIFY_STID && > > > > + !time_after((unsigned long)cps->cpntf_time, > > > > + (unsigned long)cutoff)) > > > > + _free_cpntf_state_locked(nn, cps); > > > > + } > > > > + spin_unlock(&nn->s2s_cp_lock); > > > > + > > > > spin_lock(&nn->client_lock); > > > > list_for_each_safe(pos, next, &nn->client_lru) { > > > > clp = list_entry(pos, struct nfs4_client, cl_lru); > > > > @@ -5577,6 +5661,24 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid) > > > > out: > > > > return status; > > > > } > > > > +static void > > > > +_free_cpntf_state_locked(struct nfsd_net *nn, struct nfs4_cpntf_state *cps) > > > > +{ > > > > + WARN_ON_ONCE(cps->cp_stateid.sc_type != NFS4_COPYNOTIFY_STID); > > > > + if (!refcount_dec_and_test(&cps->cp_stateid.sc_count)) > > > > + return; > > > > + list_del(&cps->cp_list); > > > > + idr_remove(&nn->s2s_cp_stateids, > > > > + cps->cp_stateid.stid.si_opaque.so_id); > > > > + kfree(cps); > > > > +} > > > > + > > > > +void nfs4_put_cpntf_state(struct nfsd_net *nn, struct nfs4_cpntf_state *cps) > > > > +{ > > > > + spin_lock(&nn->s2s_cp_lock); > > > > + _free_cpntf_state_locked(nn, cps); > > > > + spin_unlock(&nn->s2s_cp_lock); > > > > +} > > > > > > > > /* > > > > * Checks for stateid operations > > > > diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h > > > > index d9e7cbd..967b937 100644 > > > > --- a/fs/nfsd/state.h > > > > +++ b/fs/nfsd/state.h > > > > @@ -56,6 +56,14 @@ > > > > stateid_opaque_t si_opaque; > > > > } stateid_t; > > > > > > > > +typedef struct { > > > > + stateid_t stid; > > > > +#define NFS4_COPY_STID 1 > > > > +#define NFS4_COPYNOTIFY_STID 2 > > > > + unsigned char sc_type; > > > > + refcount_t sc_count; > > > > +} copy_stateid_t; > > > > + > > > > #define STATEID_FMT "(%08x/%08x/%08x/%08x)" > > > > #define STATEID_VAL(s) \ > > > > (s)->si_opaque.so_clid.cl_boot, \ > > > > @@ -96,6 +104,7 @@ struct nfs4_stid { > > > > #define NFS4_REVOKED_DELEG_STID 16 > > > > #define NFS4_CLOSED_DELEG_STID 32 > > > > #define NFS4_LAYOUT_STID 64 > > > > + struct list_head sc_cp_list; > > > > unsigned char sc_type; > > > > stateid_t sc_stateid; > > > > spinlock_t sc_lock; > > > > @@ -104,6 +113,17 @@ struct nfs4_stid { > > > > void (*sc_free)(struct nfs4_stid *); > > > > }; > > > > > > > > +/* Keep a list of stateids issued by the COPY_NOTIFY, associate it with the > > > > + * parent OPEN/LOCK/DELEG stateid. > > > > + */ > > > > +struct nfs4_cpntf_state { > > > > + copy_stateid_t cp_stateid; > > > > + struct list_head cp_list; /* per parent nfs4_stid */ > > > > + stateid_t cp_p_stateid; /* copy of parent's stateid */ > > > > + clientid_t cp_p_clid; /* copy of parent's clid */ > > > > + time_t cpntf_time; /* last time stateid used */ > > > > +}; > > > > + > > > > /* > > > > * Represents a delegation stateid. The nfs4_client holds references to these > > > > * and they are put when it is being destroyed or when the delegation is > > > > @@ -624,8 +644,10 @@ __be32 nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate, > > > > struct nfs4_stid **s, struct nfsd_net *nn); > > > > struct nfs4_stid *nfs4_alloc_stid(struct nfs4_client *cl, struct kmem_cache *slab, > > > > void (*sc_free)(struct nfs4_stid *)); > > > > -int nfs4_init_cp_state(struct nfsd_net *nn, struct nfsd4_copy *copy); > > > > -void nfs4_free_cp_state(struct nfsd4_copy *copy); > > > > +int nfs4_init_copy_state(struct nfsd_net *nn, struct nfsd4_copy *copy); > > > > +void nfs4_free_copy_state(struct nfsd4_copy *copy); > > > > +struct nfs4_cpntf_state *nfs4_alloc_init_cpntf_state(struct nfsd_net *nn, > > > > + struct nfs4_stid *p_stid); > > > > void nfs4_unhash_stid(struct nfs4_stid *s); > > > > void nfs4_put_stid(struct nfs4_stid *s); > > > > void nfs4_inc_and_copy_stateid(stateid_t *dst, struct nfs4_stid *stid); > > > > @@ -655,6 +677,8 @@ extern struct nfs4_client_reclaim *nfs4_client_to_reclaim(struct xdr_netobj name > > > > extern void nfs4_put_copy(struct nfsd4_copy *copy); > > > > extern struct nfsd4_copy * > > > > find_async_copy(struct nfs4_client *clp, stateid_t *staetid); > > > > +extern void nfs4_put_cpntf_state(struct nfsd_net *nn, > > > > + struct nfs4_cpntf_state *cps); > > > > static inline void get_nfs4_file(struct nfs4_file *fi) > > > > { > > > > refcount_inc(&fi->fi_ref); > > > > diff --git a/fs/nfsd/xdr4.h b/fs/nfsd/xdr4.h > > > > index 8231fe0..2937e06 100644 > > > > --- a/fs/nfsd/xdr4.h > > > > +++ b/fs/nfsd/xdr4.h > > > > @@ -542,7 +542,7 @@ struct nfsd4_copy { > > > > struct nfsd_file *nf_src; > > > > struct nfsd_file *nf_dst; > > > > > > > > - stateid_t cp_stateid; > > > > + copy_stateid_t cp_stateid; > > > > > > > > struct list_head copies; > > > > struct task_struct *copy_task; > > > > -- > > > > 1.8.3.1