From patchwork Wed May 11 10:21:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 9067441 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4980E9F1C1 for ; Wed, 11 May 2016 10:21:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id AC6AA20114 for ; Wed, 11 May 2016 10:21:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1B8CA20145 for ; Wed, 11 May 2016 10:21:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932152AbcEKKVa (ORCPT ); Wed, 11 May 2016 06:21:30 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:35140 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751614AbcEKKV1 (ORCPT ); Wed, 11 May 2016 06:21:27 -0400 Received: by mail-qk0-f196.google.com with SMTP id n62so2438122qkc.2 for ; Wed, 11 May 2016 03:21:27 -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=zMpIaIxLA3xfbsSGKs0ZrH0niVyChjKumTh3+xwCtOGQoQTC0nXudRl/Nlw7PQCTF1 drhmefe7XmuugvzFjAnv2Wv5NZDU70n/0Th8X06802CdGHP5GNOQwoh+nlqMqF0G9yQY TIO3mqE6fW2VUMuCYfRvy9qB51eA1L0lnUW8+hzWVYECPNIC23cyETrKz0IrB6JwBGwv suPoYLoS+YdaX1Mn42f9XsQo77mRxEM0p5fiPtOkOr5b33EEZAS2B2GbTlMUfwZ+LPIz w2ziJT+x4z0OABYT6Wb0c6QSPj80P6Gf6E72Su/KZlWOqFK9G3OhSj2O3iaiO0F0FdvZ kUIA== 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=fOFKWC5HK/tqGUvxrLuTBh6mzQYa6/BGSARBKmP5eT4vb/5BdUByhqAYjL2arssv2U Yt3AHwkY00vzE6HxnO4c+mBGM3mEBQPHg8aGvql4O/Z5a8oCoQjliPW9CEDLk+rWlGUy 0Oik7tZxcUUeoYnMHeDKKdg61vGb+EJTopVkRMCYCXRswlrA1/rSKkVPFX1pFNTaTYU1 ftGkM6GQtj7OoMYaTtgr76hantfj+/VRil8zmGR82gwWXHCh7eUZsziMgVGCDHGYv5xT 4sDTZv6csaHTk44y44PAanpgd4gTDrLjzi5bB/2LTYNJWtfvrb57NJ2JeuAZ/DM55loy hssA== X-Gm-Message-State: AOPr4FVdTNpgd7Qgw4CuQjbI211ArtasBOVj5l1yb34FCmh7j9IZtM+WY22WZvzLSQ9KMA== X-Received: by 10.55.221.205 with SMTP id u74mr2471843qku.86.1462962086347; Wed, 11 May 2016 03:21:26 -0700 (PDT) Received: from tlielax.poochiereds.net ([2606:a000:1125:4074:3a60:77ff:fe93:a95d]) by smtp.googlemail.com with ESMTPSA id r127sm3048446qkf.47.2016.05.11.03.21.25 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 11 May 2016 03:21:25 -0700 (PDT) From: Jeff Layton X-Google-Original-From: Jeff Layton To: Trond Myklebust , Anna Schumaker Cc: linux-nfs@vger.kernel.org Subject: [PATCH v2 3/9] pnfs: keep track of the return sequence number in pnfs_layout_hdr Date: Wed, 11 May 2016 06:21:08 -0400 Message-Id: <1462962074-6989-4-git-send-email-jeff.layton@primarydata.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1462962074-6989-1-git-send-email-jeff.layton@primarydata.com> References: <1462962074-6989-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 */