From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83EC5C606CD for ; Mon, 8 Jul 2019 19:23:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5E8C32086D for ; Mon, 8 Jul 2019 19:23:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AOXz4f7G" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391647AbfGHTX4 (ORCPT ); Mon, 8 Jul 2019 15:23:56 -0400 Received: from mail-io1-f65.google.com ([209.85.166.65]:47056 "EHLO mail-io1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729193AbfGHTXz (ORCPT ); Mon, 8 Jul 2019 15:23:55 -0400 Received: by mail-io1-f65.google.com with SMTP id i10so37785006iol.13 for ; Mon, 08 Jul 2019 12:23:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=1DYhl4o2u4Qt+0cLmr6alwIbXlZunWsjLZGLHFbDjDQ=; b=AOXz4f7GVLDHMoI09FZzd6eaga+YYExapPd7Cg6cOsSxvzQiwuvbSVTEAAd3bqUK2r m+sdiSEaFxd4ngHYU0+nlgotVxqhUhzE1pOWvrQ1MVTwJELOUtTWTnhzalXDcAz+y7St /5KgNEaDq5TXzyWw+59F30u1WeRJ4sMqkBeKfCS8GU5zQWEXQVlEAFaNfpbC4TMcHSkA Fo2lhA55d//l3Rlx7ugPhv0c38zVp/gE8xnQHJ5Ca65LlL8Hl+q8y1mM1Lb/H3jD+u/Y YcU/J5IANVB0mx49Tomlw3CGRhKCpHLWdxQbBr6kXu/oHCqJGuch/Au6u8LnInueaCMs Bc9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=1DYhl4o2u4Qt+0cLmr6alwIbXlZunWsjLZGLHFbDjDQ=; b=IHuFSuQa0+rHeNOnYN/H2jTeNLYvBhYeVVYfU3T7XBbghEbEUgo+Z2RSy5SrbQtgjs 8UKJytjEsXc+URyoiRjf69Nncb7KyksYyzRYwkINZQOxyxn34IkTM280lfL67lLpGG4c CPCc5gx9nhmcqNcw2l68Y80cWJL/0F+AOMZovnF8mCM6OvYixPRG3zUAklIuoyhCYlXq OQhCLERm0nPubga4bXTJTEdSmyYKFWZpZggY/MrlC9PrOM9u6s33caquBCJpBgvWQZXv 7ZJIh8BeDgKf8LhMPgv6Iz27okzipAp16LkcT4MSwxGuv0/ZNzvhHS1hh0kP48KRPnrp OApw== X-Gm-Message-State: APjAAAXpm9SAiZsiZ7oBwODoz0WFETLHLznPacTsKuvLgJgKtNgi5ij1 pbnnU12AKhCj/Ama7hSjJ8U= X-Google-Smtp-Source: APXvYqz7otUBYuLx6MMIxaPiZ4LJ2dDznIwYGZBLFTeDYQQqvNNJN/zHmu0Zfsv2I2xWY5LLH1vPZQ== X-Received: by 2002:a6b:c9d8:: with SMTP id z207mr20061886iof.184.1562613835127; Mon, 08 Jul 2019 12:23:55 -0700 (PDT) Received: from Olgas-MBP-201.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id v3sm9212841iom.53.2019.07.08.12.23.54 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 08 Jul 2019 12:23:54 -0700 (PDT) From: Olga Kornievskaia To: bfields@redhat.com Cc: linux-nfs@vger.kernel.org Subject: [PATCH v4 5/8] NFSD check stateids against copy stateids Date: Mon, 8 Jul 2019 15:23:49 -0400 Message-Id: <20190708192352.12614-6-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20190708192352.12614-1-olga.kornievskaia@gmail.com> References: <20190708192352.12614-1-olga.kornievskaia@gmail.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org Incoming stateid (used by a READ) could be a saved copy stateid. On first use make it active and check that the copy has started within the allowable lease time. Signed-off-by: Olga Kornievskaia --- fs/nfsd/nfs4state.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 2555eb9..b786625 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -5232,6 +5232,49 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid) return 0; } +/* + * A READ from an inter server to server COPY will have a + * copy stateid. Return the parent nfs4_stid. + */ +static __be32 _find_cpntf_state(struct nfsd_net *nn, stateid_t *st, + struct nfs4_cpntf_state **cps) +{ + struct nfs4_cpntf_state *state = NULL; + + if (st->si_opaque.so_clid.cl_id != nn->s2s_cp_cl_id) + return nfserr_bad_stateid; + spin_lock(&nn->s2s_cp_lock); + state = idr_find(&nn->s2s_cp_stateids, st->si_opaque.so_id); + if (state) + refcount_inc(&state->cp_p_stid->sc_count); + spin_unlock(&nn->s2s_cp_lock); + if (!state) + return nfserr_bad_stateid; + *cps = state; + return 0; +} + +static __be32 find_cpntf_state(struct nfsd_net *nn, stateid_t *st, + struct nfs4_stid **stid) +{ + __be32 status; + struct nfs4_cpntf_state *cps = NULL; + + status = _find_cpntf_state(nn, st, &cps); + if (status) + return status; + + /* Did the inter server to server copy start in time? */ + if (cps->cp_active == false && !time_after(cps->cp_timeout, jiffies)) { + nfs4_put_stid(cps->cp_p_stid); + return nfserr_partner_no_auth; + } else + cps->cp_active = true; + + *stid = cps->cp_p_stid; + + return nfs_ok; +} /* * Checks for stateid operations @@ -5264,6 +5307,8 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid) status = nfsd4_lookup_stateid(cstate, stateid, NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID, &s, nn); + if (status == nfserr_bad_stateid) + status = find_cpntf_state(nn, stateid, &s); if (status) return status; status = nfsd4_stid_check_stateid_generation(stateid, s, -- 1.8.3.1