From patchwork Fri Jul 22 19:33:57 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 9244175 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 160166077C for ; Fri, 22 Jul 2016 19:34:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 07F7722376 for ; Fri, 22 Jul 2016 19:34:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F12A7223A4; Fri, 22 Jul 2016 19:34:52 +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=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, 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 988F523B3D for ; Fri, 22 Jul 2016 19:34:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753201AbcGVTev (ORCPT ); Fri, 22 Jul 2016 15:34:51 -0400 Received: from mail-it0-f65.google.com ([209.85.214.65]:36648 "EHLO mail-it0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753016AbcGVTeu (ORCPT ); Fri, 22 Jul 2016 15:34:50 -0400 Received: by mail-it0-f65.google.com with SMTP id j124so3675976ith.3 for ; Fri, 22 Jul 2016 12:34:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=XXz/nZMhwhYwvzqMLNqlC/uLRKIt5LvaYk9ze6ix+DE=; b=x015RsHskypRWY/buVFeHUxfx08g1zA42jaPE/A5xqDaOItlACKA5Zsjg24uDpqi31 jlSXG4OSsDvkzV/YkMWksHxjyGq585ljle/nmQ+cvo6SD//D5OUJElRwWYnXopFCGZ9V ADkY4mjvpCSDGr4lH6BplcB2xRvbF9pjrs1ajdJwjGch3UGWNmHQRj+gXXVuo6ihqdNy 5Ym33GH3qR1ET6eDglcrGjijmzShiLExRgxcEO7lazPRx30YDgJa7WTMsCeLlfdBC9+G TRtQ/nwn1wZbeYLGz/7ladn6OvZK55u4EHXFXP0Wpgtd68TIWoQ3uvWc1TE64l7qgEWH 3i3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=XXz/nZMhwhYwvzqMLNqlC/uLRKIt5LvaYk9ze6ix+DE=; b=lzUvQReyfCBEskr9mZ3uJGcxNTmloFyJXjmzisBywNS35XYymYYnL3RCI3l0acTDmO 0wZGpMt536LLng3e1GaijBa700G/xQzM3c8Btk4gEPwLxCAzas247VT2TfcnL16r261e MLV7H4Sd8Dn3i6CPTCZ5/RsISxpKQuuc40Zi6dTyQgfxhWP1udvYiFznibbGb2ut/jjo iV/mBxfZ5b66SRkdOKTeNV5YAtcwJ+8lRGYInvE1pEPBndWQldqttjKWOH1l92P+UEiZ U9t9HzbApXfhPvT3N/rw7K4zqGM5xuW/qcTcdBhZLOXlwHdk+8FMjbEcRgRSjntsnOFq tnNw== X-Gm-Message-State: ALyK8tKAVN49zGA3OSwoP9h8f/lui5xV+R+vz+miasSGR0zvWpYDiLPL2HdjaLLJxOUCQw== X-Received: by 10.36.217.68 with SMTP id p65mr65723355itg.9.1469216089954; Fri, 22 Jul 2016 12:34:49 -0700 (PDT) Received: from leira.trondhjem.org.localdomain ([50.108.12.87]) by smtp.gmail.com with ESMTPSA id v77sm3888948ita.12.2016.07.22.12.34.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Jul 2016 12:34:49 -0700 (PDT) From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 5/6] NFS: pnfs_mark_matching_lsegs_return() should match the layout sequence id Date: Fri, 22 Jul 2016 15:33:57 -0400 Message-Id: <1469216038-71882-6-git-send-email-trond.myklebust@primarydata.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1469216038-71882-5-git-send-email-trond.myklebust@primarydata.com> References: <1469216038-71882-1-git-send-email-trond.myklebust@primarydata.com> <1469216038-71882-2-git-send-email-trond.myklebust@primarydata.com> <1469216038-71882-3-git-send-email-trond.myklebust@primarydata.com> <1469216038-71882-4-git-send-email-trond.myklebust@primarydata.com> <1469216038-71882-5-git-send-email-trond.myklebust@primarydata.com> 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 When determining which layout segments to return, we do want pnfs_mark_matching_lsegs_return to check that they match the layout sequence id. This ensures that we don't waste time if the server is replaying a layout recall that has already been satisfied. Signed-off-by: Trond Myklebust --- fs/nfs/pnfs.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 010f8803090b..0d68768e7afe 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -484,15 +484,6 @@ pnfs_lseg_range_intersecting(const struct pnfs_layout_range *l1, (end2 == NFS4_MAX_UINT64 || end2 > start1); } -static bool -should_free_lseg(const struct pnfs_layout_range *lseg_range, - const struct pnfs_layout_range *recall_range) -{ - return (recall_range->iomode == IOMODE_ANY || - lseg_range->iomode == recall_range->iomode) && - pnfs_lseg_range_intersecting(lseg_range, recall_range); -} - static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg, struct list_head *tmp_list) { @@ -531,6 +522,27 @@ static bool pnfs_seqid_is_newer(u32 s1, u32 s2) return (s32)(s1 - s2) > 0; } +static bool +pnfs_should_free_range(const struct pnfs_layout_range *lseg_range, + const struct pnfs_layout_range *recall_range) +{ + return (recall_range->iomode == IOMODE_ANY || + lseg_range->iomode == recall_range->iomode) && + pnfs_lseg_range_intersecting(lseg_range, recall_range); +} + +static bool +pnfs_match_lseg_recall(const struct pnfs_layout_segment *lseg, + const struct pnfs_layout_range *recall_range, + u32 seq) +{ + if (seq != 0 && pnfs_seqid_is_newer(lseg->pls_seq, seq)) + return false; + if (recall_range == NULL) + return true; + return pnfs_should_free_range(&lseg->pls_range, recall_range); +} + /** * pnfs_mark_matching_lsegs_invalid - tear down lsegs or mark them for later * @lo: layout header containing the lsegs @@ -560,10 +572,7 @@ pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo, if (list_empty(&lo->plh_segs)) return 0; list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) - if (!recall_range || - should_free_lseg(&lseg->pls_range, recall_range)) { - if (seq && pnfs_seqid_is_newer(lseg->pls_seq, seq)) - continue; + if (pnfs_match_lseg_recall(lseg, recall_range, seq)) { dprintk("%s: freeing lseg %p iomode %d seq %u" "offset %llu length %llu\n", __func__, lseg, lseg->pls_range.iomode, lseg->pls_seq, @@ -1839,7 +1848,7 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo, assert_spin_locked(&lo->plh_inode->i_lock); list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) - if (should_free_lseg(&lseg->pls_range, return_range)) { + if (pnfs_match_lseg_recall(lseg, return_range, seq)) { dprintk("%s: marking lseg %p iomode %d " "offset %llu length %llu\n", __func__, lseg, lseg->pls_range.iomode,