From patchwork Tue Apr 25 20:34:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 9699695 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 EDB1460224 for ; Tue, 25 Apr 2017 20:34:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DEEF72842B for ; Tue, 25 Apr 2017 20:34:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D38F328471; Tue, 25 Apr 2017 20: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.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, 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 391442842B for ; Tue, 25 Apr 2017 20:34:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1953785AbdDYUeu (ORCPT ); Tue, 25 Apr 2017 16:34:50 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:33439 "EHLO mail-it0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1953563AbdDYUes (ORCPT ); Tue, 25 Apr 2017 16:34:48 -0400 Received: by mail-it0-f66.google.com with SMTP id z67so23065320itb.0 for ; Tue, 25 Apr 2017 13:34:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=HqxeBjhxG3jAiNEzlg2Q1ONXMTIoAphBrfeUkreHvn4=; b=qdvQxwgtHmKKvirNR7rhTeI4dyW3lqDVC4xyOzBAVYUAEvRyoQnb72AOJAPGzI4knr FQz/tRhtb6X8Cfaw/R4HXbZ+98Ms3DEmj6nnyv5De/Ccxd/qk/KFQHzkhFV77A3f6kpz jcRheNS3D7uTauIKhzBqviofcaArzT0wybOHUsBTAJZ9zCB+c+LxewN7NGYDhfz3wHFM J72TkDto6Hf4SDutH2qs5Z6WgBvr9X+runaNhgYMTH3SaO4RPulnn3uK58G0d7Cp/aP/ M3aICXc2g5m2wvnadcl1I8CXsw/WNFhg2xMw0ot5wJ7dRjAy8rqrRN1JL6Mb5UVZBaiq rf3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=HqxeBjhxG3jAiNEzlg2Q1ONXMTIoAphBrfeUkreHvn4=; b=ofK/MXRZsyFXGL0o/G0bF83io1iETsxdqWGp8nL45h0RcttRaveOMcSYnqiV/yHGge tUfMqM/8QizH1gSRNXoGJn8LEbwmwuTK1pMpZ5Umo2SzwBAa3Xhc+Ve7WVGw3FURWThR o1G0APaHkm8GXXm1flpFoeadSgCCmq1DXNc1pRPHy4BDGunnI5jXWbGrJvTD8p7slD+B EG+zyH7ZcxcPZozrxsVQ7mrY8FIpC/MBjTW0VvtEwZTmzv2YQQlc49RL1a8m3uiusZaO ZXlOCMtQ+D9+ykagodYQkOi70+omSvFzG0Tj2X7cAmSRSPo0yYShGcOjezEyH965pRDi YnzQ== X-Gm-Message-State: AN3rC/6sWK1KGcb6rAmjkvHlmk0BNODGyL00Co15ajM9Rvjfxa0/JZEy qk8Rwvy5kAJOPw== X-Received: by 10.36.108.147 with SMTP id w141mr2951808itb.57.1493152487949; Tue, 25 Apr 2017 13:34:47 -0700 (PDT) Received: from localhost.localdomain (static-50-108-22-66.mskg.mi.frontiernet.net. [50.108.22.66]) by smtp.gmail.com with ESMTPSA id 9sm468411iol.36.2017.04.25.13.34.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Apr 2017 13:34:47 -0700 (PDT) From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH 1/2] pNFS: Ensure we check layout segment validity in the pg_init() callback Date: Tue, 25 Apr 2017 16:34:42 -0400 Message-Id: <20170425203443.37006-2-trond.myklebust@primarydata.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170425203443.37006-1-trond.myklebust@primarydata.com> References: <20170425203443.37006-1-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 If we have a layout segment cached in pgio->pg_lseg, we should check it for validity before reusing it in a new RPC request. Otherwise, if we recoalesce, we can end up looping forever. Signed-off-by: Trond Myklebust --- fs/nfs/filelayout/filelayout.c | 2 ++ fs/nfs/flexfilelayout/flexfilelayout.c | 2 ++ fs/nfs/pnfs.c | 13 +++++++++++++ fs/nfs/pnfs.h | 1 + 4 files changed, 18 insertions(+) diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index acd30baca461..d4174da89302 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c @@ -933,6 +933,7 @@ static void filelayout_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) { + pnfs_generic_pg_check_layout(pgio); if (!pgio->pg_lseg) { pgio->pg_lseg = fl_pnfs_update_layout(pgio->pg_inode, req->wb_context, @@ -959,6 +960,7 @@ filelayout_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_commit_info cinfo; int status; + pnfs_generic_pg_check_layout(pgio); if (!pgio->pg_lseg) { pgio->pg_lseg = fl_pnfs_update_layout(pgio->pg_inode, req->wb_context, diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 42dedf2d625f..f23b63eb356e 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -846,6 +846,7 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio, int ds_idx; retry: + pnfs_generic_pg_check_layout(pgio); /* Use full layout for now */ if (!pgio->pg_lseg) ff_layout_pg_get_read(pgio, req, false); @@ -894,6 +895,7 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio, int status; retry: + pnfs_generic_pg_check_layout(pgio); if (!pgio->pg_lseg) { pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, req->wb_context, diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index 3917a6272789..634adb3f8524 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -2073,10 +2073,22 @@ void pnfs_error_mark_layout_for_return(struct inode *inode, EXPORT_SYMBOL_GPL(pnfs_error_mark_layout_for_return); void +pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio) +{ + if (pgio->pg_lseg == NULL || + test_bit(NFS_LSEG_VALID, &pgio->pg_lseg->pls_flags)) + return; + pnfs_put_lseg(pgio->pg_lseg); + pgio->pg_lseg = NULL; +} +EXPORT_SYMBOL_GPL(pnfs_generic_pg_check_layout); + +void pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *req) { u64 rd_size = req->wb_bytes; + pnfs_generic_pg_check_layout(pgio); if (pgio->pg_lseg == NULL) { if (pgio->pg_dreq == NULL) rd_size = i_size_read(pgio->pg_inode) - req_offset(req); @@ -2107,6 +2119,7 @@ void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, struct nfs_page *req, u64 wb_size) { + pnfs_generic_pg_check_layout(pgio); if (pgio->pg_lseg == NULL) { pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, req->wb_context, diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h index 825a1b8ddc4f..2d05b756a8d6 100644 --- a/fs/nfs/pnfs.h +++ b/fs/nfs/pnfs.h @@ -234,6 +234,7 @@ void pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg); void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *); void unset_pnfs_layoutdriver(struct nfs_server *); +void pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio); void pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *, struct nfs_page *); int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc); void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,