From patchwork Sun May 15 01:06:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 9095771 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id C6865BF29F for ; Sun, 15 May 2016 01:07:09 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D37492025A for ; Sun, 15 May 2016 01:07:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D59A520268 for ; Sun, 15 May 2016 01:07:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754015AbcEOBHA (ORCPT ); Sat, 14 May 2016 21:07:00 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:34688 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754010AbcEOBG7 (ORCPT ); Sat, 14 May 2016 21:06:59 -0400 Received: by mail-qk0-f193.google.com with SMTP id i7so11333994qkd.1 for ; Sat, 14 May 2016 18:06:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=poochiereds-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NVHfI2m4vwevoqbnVn9iUral5RSJ7yh9Vy1+xzYH3LA=; b=h09AL4nzciEE2UboIFEESp+oUDgvuR/lZEm2ub6wMGnwQ1ovbHuJO8aqyC8AvkjTh7 klu/R6TDF3Ocr2InJ+07Fo5/W7ARmhBgkGZQGtnISggcx6TThq8Ph0PZVeHCuqU+DRWc hnn9PXcg5OzQ+64+CZevdupOdGZpfFHpgePkOklOxa/9K2ItkYExKmDAG2kXPge8QWJG FK9WVWP9YNIX9e9N/Xb7uxtGfZmVWjDl0QuzY3OAoPMpAHowBYTnTIaXcbfTia06hilh ycuGhzOxJcsYiwJMJy2vqLEw14nIi9QDHP+NZwqInZ+CV6Bq2wm2J6u4WR4uG4zE8FJ6 skQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=NVHfI2m4vwevoqbnVn9iUral5RSJ7yh9Vy1+xzYH3LA=; b=Ad0i9vs6FO5QHOA9jgFtF6NBhPDBOPpf2hMR9kE0SGRsg5EsyqOxXXwkVxG9mBc23T mHQ3dgljhkjQ29pzVLrXulyNw7KNPAB1+s16dWWFUIyWBAlYo+AqelOOyrwznC4J54Tt TgXOEIH20yFo1bBZ4tokz+siU1u1JgPZ+ZpUMEfe47PCOQIh5BNCHuqtZuQCZpBut898 Zhuh/8EbHKYru9S4TNciAmVH3S9MnXbxyQJupnMF/z26CVXdWPRVxbIJC4K02DVHJcUh PH/1UQqnGOwIpiOdWGuDOisugJVL+OnGZMvmGXgxyudjzh/tvr/SNCnAy6M+4xu+sNCh 4xiw== X-Gm-Message-State: AOPr4FWveRsupUFKs2mQCzh8+Z1wsfBSaLyA6nPv0cjTSVHTFJnjtHjAuT5q52gn9J7VGA== X-Received: by 10.55.88.5 with SMTP id m5mr23120972qkb.134.1463274418001; Sat, 14 May 2016 18:06:58 -0700 (PDT) Received: from tlielax.poochiereds.net ([2606:a000:1125:4074:3a60:77ff:fe93:a95d]) by smtp.googlemail.com with ESMTPSA id d12sm11520330qhd.13.2016.05.14.18.06.56 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 14 May 2016 18:06:57 -0700 (PDT) From: Jeff Layton X-Google-Original-From: Jeff Layton To: Trond Myklebust , Anna Schumaker Cc: linux-nfs@vger.kernel.org, hch@infradead.org Subject: [PATCH v3 06/13] pnfs: keep track of the return sequence number in pnfs_layout_hdr Date: Sat, 14 May 2016 21:06:35 -0400 Message-Id: <1463274402-17746-7-git-send-email-jeff.layton@primarydata.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1463274402-17746-1-git-send-email-jeff.layton@primarydata.com> References: <1463274402-17746-1-git-send-email-jeff.layton@primarydata.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-8.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP When we want to selectively do a LAYOUTRETURN, we need to specify a stateid that represents most recent layout acquisition that is to be returned. When we mark a layout stateid to be returned, we update the return sequence number in the layout header with that value, if it's newer than the existing one. Then, when we go to do a LAYOUTRETURN on layout header put, we overwrite the seqid in the stateid with the saved one, and then zero it out. Signed-off-by: Jeff Layton --- fs/nfs/pnfs.c | 11 ++++++++--- fs/nfs/pnfs.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 18b6f950e300..39432a3705b4 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -899,6 +899,7 @@ pnfs_prepare_layoutreturn(struct pnfs_layout_hdr *lo) if (test_and_set_bit(NFS_LAYOUT_RETURN, &lo->plh_flags)) return false; lo->plh_return_iomode = 0; + lo->plh_return_seq = 0; pnfs_get_layout_hdr(lo); clear_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags); return true; @@ -969,6 +970,7 @@ static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo) bool send; nfs4_stateid_copy(&stateid, &lo->plh_stateid); + stateid.seqid = cpu_to_be32(lo->plh_return_seq); iomode = lo->plh_return_iomode; send = pnfs_prepare_layoutreturn(lo); spin_unlock(&inode->i_lock); @@ -1747,7 +1749,8 @@ out_forget_reply: } static void -pnfs_set_plh_return_iomode(struct pnfs_layout_hdr *lo, enum pnfs_iomode iomode) +pnfs_set_plh_return_info(struct pnfs_layout_hdr *lo, enum pnfs_iomode iomode, + u32 seq) { if (lo->plh_return_iomode == iomode) return; @@ -1755,6 +1758,8 @@ pnfs_set_plh_return_iomode(struct pnfs_layout_hdr *lo, enum pnfs_iomode iomode) iomode = IOMODE_ANY; lo->plh_return_iomode = iomode; set_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags); + if (!lo->plh_return_seq || pnfs_seqid_is_newer(seq, lo->plh_return_seq)) + lo->plh_return_seq = seq; } /** @@ -1793,7 +1798,7 @@ pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo, continue; remaining++; set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags); - pnfs_set_plh_return_iomode(lo, return_range->iomode); + pnfs_set_plh_return_info(lo, return_range->iomode, lseg->pls_seq); } return remaining; } @@ -1811,7 +1816,7 @@ void pnfs_error_mark_layout_for_return(struct inode *inode, bool return_now = false; spin_lock(&inode->i_lock); - pnfs_set_plh_return_iomode(lo, range.iomode); + pnfs_set_plh_return_info(lo, range.iomode, lseg->pls_seq); /* * mark all matching lsegs so that we are sure to have no live * segments at hand when sending layoutreturn. See pnfs_put_lseg() diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 361fa5494aa5..3476c9850678 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -195,6 +195,7 @@ struct pnfs_layout_hdr { unsigned long plh_flags; nfs4_stateid plh_stateid; u32 plh_barrier; /* ignore lower seqids */ + u32 plh_return_seq; enum pnfs_iomode plh_return_iomode; loff_t plh_lwb; /* last write byte for layoutcommit */ struct rpc_cred *plh_lc_cred; /* layoutcommit cred */