From patchwork Wed Jun 27 18:18:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 10492369 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B3D5560230 for ; Wed, 27 Jun 2018 18:18:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D07DC2991F for ; Wed, 27 Jun 2018 18:18:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C50B3299AB; Wed, 27 Jun 2018 18:18:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6078D2991F for ; Wed, 27 Jun 2018 18:18:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965736AbeF0SS5 (ORCPT ); Wed, 27 Jun 2018 14:18:57 -0400 Received: from mail-it0-f65.google.com ([209.85.214.65]:37154 "EHLO mail-it0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965557AbeF0SSz (ORCPT ); Wed, 27 Jun 2018 14:18:55 -0400 Received: by mail-it0-f65.google.com with SMTP id p17-v6so3845572itc.2 for ; Wed, 27 Jun 2018 11:18:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=SPPevvgPYO4j4nUNjvvPruXMVCozZEcetM7MG38nsRg=; b=WOcKSEJceq5JYJzsvAbkoK3PCHe1r1WJKGxinGqiglZwwE8Vwiy0sIHV7oR2dddiNB t0VFHQ/ixVlQqhijMTI8uMFywu+udOnXwUQUiHSIp2qYZuGb/aZRtxmCuSMvKDsQzslP oQs8kvQHpwwkKNy4+YhIDH8n/Q/TJw5nrgbjn4Sc2ARg3HnE1gTLfmLtpVO/DgHb8t7c M8nwhlGDkl8tU797ZPmtNUjdoDXLeOyrPEr56+5nsMtVP8HHz3eh+auyIkG90lFXS3/A AZ2E6WIvYRmVIo2bxsXb1iklqfspDk2uXy2E/OJ2Ph2P5cTDVQ8R960YZfGiPnKUvBSp 4+Sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SPPevvgPYO4j4nUNjvvPruXMVCozZEcetM7MG38nsRg=; b=NgaW1W18we/QOa/Xf4jugn1FJkMWQQr4iK1/B674RmejDNw2N6lzQrcOiM+TADUsle qexIZvCm4qmvIDhObv56GXrUboi0lt8ahQomuyb55ejGuifmYwmgVgs5GTM8LeQ61GX0 sMKkg040qsnW8nGetemO9zg97QcEhV/ezqxcFxI26zNkhn2NyWRdcF2hhs+fvhMiDLrj 3J+632OBHGXCmB4uALrbPBfygZ519kDZeYLhC8Gjvuu0+GkJyXfvZ17+fszHMhB62YrF 7m2j2Z8tyrNb2RCG/cTuVYj+rfQMW21Wv2xF5tFMdk4rpS5tgY0aoSV9WgboSCI9rrg0 FMGQ== X-Gm-Message-State: APt69E0rGbBPLSGm2dmU4iJ7bS8rS61PHDyXzzh92ezwhSuaBYMxMwoL UrcAHcFVH4snhTXx5dqHLTpToCM= X-Google-Smtp-Source: AAOMgpfGSD5viK8zlH9lEo73FUY4RPVV+QHf3Tfixo2GKLSxHvxjHzE6+zq80SUeJCURC42Y6Ft0cg== X-Received: by 2002:a02:3d58:: with SMTP id n85-v6mr5731010jan.99.1530123534860; Wed, 27 Jun 2018 11:18:54 -0700 (PDT) Received: from leira.trondhjem.org.localdomain ([50.105.87.45]) by smtp.gmail.com with ESMTPSA id x5-v6sm2105233ioa.65.2018.06.27.11.18.53 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 27 Jun 2018 11:18:54 -0700 (PDT) From: Trond Myklebust X-Google-Original-From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 5/5] pNFS: Wait for stale layoutget calls to complete in pnfs_update_layout() Date: Wed, 27 Jun 2018 14:18:28 -0400 Message-Id: <20180627181828.27680-5-trond.myklebust@hammerspace.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180627181828.27680-4-trond.myklebust@hammerspace.com> References: <20180627181828.27680-1-trond.myklebust@hammerspace.com> <20180627181828.27680-2-trond.myklebust@hammerspace.com> <20180627181828.27680-3-trond.myklebust@hammerspace.com> <20180627181828.27680-4-trond.myklebust@hammerspace.com> MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP If the old layout was recalled, and we returned NFS4ERR_NOMATCHINGLAYOUT then we need to wait for all outstanding layoutget calls to complete before we can send a new one. Signed-off-by: Trond Myklebust --- fs/nfs/pnfs.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index bf7f0b21066d..030c39c107c2 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -1740,6 +1740,17 @@ static bool pnfs_prepare_to_retry_layoutget(struct pnfs_layout_hdr *lo) TASK_UNINTERRUPTIBLE); } +static void nfs_layoutget_begin(struct pnfs_layout_hdr *lo) +{ + atomic_inc(&lo->plh_outstanding); +} + +static void nfs_layoutget_end(struct pnfs_layout_hdr *lo) +{ + if (atomic_dec_and_test(&lo->plh_outstanding)) + wake_up_var(&lo->plh_outstanding); +} + static void pnfs_clear_first_layoutget(struct pnfs_layout_hdr *lo) { unsigned long *bitlock = &lo->plh_flags; @@ -1839,6 +1850,21 @@ pnfs_update_layout(struct inode *ino, goto out_unlock; } + /* + * If the layout segment list is empty, but there are outstanding + * layoutget calls, then they might be subject to a layoutrecall. + */ + if (list_empty(&lo->plh_segs) && + atomic_read(&lo->plh_outstanding) != 0) { + spin_unlock(&ino->i_lock); + if (wait_var_event_killable(&lo->plh_outstanding, + atomic_read(&lo->plh_outstanding) == 0 + || !list_empty(&lo->plh_segs))) + goto out_put_layout_hdr; + pnfs_put_layout_hdr(lo); + goto lookup_again; + } + lseg = pnfs_find_lseg(lo, &arg, strict_iomode); if (lseg) { trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg, @@ -1912,7 +1938,7 @@ pnfs_update_layout(struct inode *ino, PNFS_UPDATE_LAYOUT_BLOCKED); goto out_unlock; } - atomic_inc(&lo->plh_outstanding); + nfs_layoutget_begin(lo); spin_unlock(&ino->i_lock); _add_to_server_list(lo, server); @@ -1929,14 +1955,14 @@ pnfs_update_layout(struct inode *ino, if (!lgp) { trace_pnfs_update_layout(ino, pos, count, iomode, lo, NULL, PNFS_UPDATE_LAYOUT_NOMEM); - atomic_dec(&lo->plh_outstanding); + nfs_layoutget_end(lo); goto out_put_layout_hdr; } lseg = nfs4_proc_layoutget(lgp, &timeout); trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg, PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); - atomic_dec(&lo->plh_outstanding); + nfs_layoutget_end(lo); if (IS_ERR(lseg)) { switch(PTR_ERR(lseg)) { case -EBUSY: @@ -2031,7 +2057,7 @@ _pnfs_grab_empty_layout(struct inode *ino, struct nfs_open_context *ctx) goto out_unlock; if (test_and_set_bit(NFS_LAYOUT_FIRST_LAYOUTGET, &lo->plh_flags)) goto out_unlock; - atomic_inc(&lo->plh_outstanding); + nfs_layoutget_begin(lo); spin_unlock(&ino->i_lock); _add_to_server_list(lo, NFS_SERVER(ino)); return lo; @@ -2172,8 +2198,8 @@ void nfs4_lgopen_release(struct nfs4_layoutget *lgp) struct inode *inode = lgp->args.inode; if (inode) { struct pnfs_layout_hdr *lo = NFS_I(inode)->layout; - atomic_dec(&lo->plh_outstanding); pnfs_clear_first_layoutget(lo); + nfs_layoutget_end(lo); } pnfs_layoutget_free(lgp); }