From patchwork Thu May 5 18:24:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 9026501 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 5C0F1BF440 for ; Thu, 5 May 2016 18:25:02 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5D1F1203C3 for ; Thu, 5 May 2016 18:25:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 716D7203E3 for ; Thu, 5 May 2016 18:25:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754169AbcEESY7 (ORCPT ); Thu, 5 May 2016 14:24:59 -0400 Received: from mail-qk0-f175.google.com ([209.85.220.175]:36707 "EHLO mail-qk0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751498AbcEESY6 (ORCPT ); Thu, 5 May 2016 14:24:58 -0400 Received: by mail-qk0-f175.google.com with SMTP id x7so47665084qkd.3 for ; Thu, 05 May 2016 11:24: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=nmVSXs1oJcx8kGhyVcum2KtoaitjXFc7f5R2uBmmBGI=; b=q9zD6FDAxlSM9Aq/i9zww6sZkyZItBD6HSUCdx8e+/mm/UeVJh9TsCfSPuzYzSsk2P Ev6Q3s4rm3vrxqw488hMpw/lSmjHFMQBzP4TrMz/2c/LFIak5lENTfaJd1UTy0GBpaJm PICQizHwGA5+tbGFnGwh864KVJ1p1RcTPMVc1GqQrp1AGtTR23k0jl3JBWvFgHWXpatK WeuqSzXJWrMpPa8LBsJ3ovEv1ZWmirjyHGshDE3sCacAMoWyLX0xSKqmt3sNW36fIO9o qWMfWBMseMwJQ4Qnl/p0ZSdLkOsBTu3S1V32XQMw/4Uyx8101qYW1J6KAge8JRHxUxGS RG2w== 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=nmVSXs1oJcx8kGhyVcum2KtoaitjXFc7f5R2uBmmBGI=; b=aOohBdReXwwIf6bYuujpOkZBl1rSB4iZ7ARLi3U/1TE24btnQDQuXzLq4F7SKW69wX ZfbH5PAbdV1hb0e9y+cXCs6rzK5qyky6yAiza9xaj8iH00CqxrKB4PlQU15GsrVo3IpN flwvg+G6Xa7b5s4xgGIf0xkm49ooRuj8lMC1BB9axceTFa/IUAmI4417NcSEbPAK2mSG /oM626CmPv5nIPbmWTcqZpv3MQkicGh5kGIDiLx0chqLsX/xAp2wSkYEyaUIOE+1fWq7 rwucOc0y8FyZGj/6EBWqtQCSpoXxQfdpb8cBgDaLEW5Z8I+6cYayfiTZYrhUIA991c2d sEhg== X-Gm-Message-State: AOPr4FW4P6MbFFh7DbL6XpPA7Ek9Qy2qTQKaysK5v1IR3u42KS5tK+FvlOTtzkGwr0o4iw== X-Received: by 10.55.212.210 with SMTP id s79mr16345199qks.104.1462472697501; Thu, 05 May 2016 11:24:57 -0700 (PDT) Received: from tlielax.poochiereds.net ([2606:a000:1125:4074:3a60:77ff:fe93:a95d]) by smtp.googlemail.com with ESMTPSA id x136sm4049807qkb.27.2016.05.05.11.24.56 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 05 May 2016 11:24:56 -0700 (PDT) From: Jeff Layton X-Google-Original-From: Jeff Layton To: linux-nfs@vger.kernel.org Cc: hch@lst.de, Anna.Schumaker@netapp.com Subject: [RFC PATCH 3/6] nfs: keep track of the return sequence number in pnfs_layout_hdr Date: Thu, 5 May 2016 14:24:45 -0400 Message-Id: <1462472688-5663-4-git-send-email-jeff.layton@primarydata.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1462472688-5663-1-git-send-email-jeff.layton@primarydata.com> References: <1462472688-5663-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.9 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 7cc2c431f355..12016ed54e1d 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 62e61cf0ad98..47042084888c 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 */