From patchwork Tue Apr 25 20:35:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 9699699 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 0392960224 for ; Tue, 25 Apr 2017 20:35:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E8DBA28471 for ; Tue, 25 Apr 2017 20:35:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DC6D2284D4; Tue, 25 Apr 2017 20:35:29 +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 6AB6E28471 for ; Tue, 25 Apr 2017 20:35:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1033854AbdDYUf2 (ORCPT ); Tue, 25 Apr 2017 16:35:28 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:34650 "EHLO mail-it0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1953563AbdDYUf1 (ORCPT ); Tue, 25 Apr 2017 16:35:27 -0400 Received: by mail-it0-f66.google.com with SMTP id c26so15147946itd.1 for ; Tue, 25 Apr 2017 13:35:26 -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; bh=doR454/mG0l4w47krMI91YqoR0A7eFI6vvJMPhUL4vo=; b=URT4oGIQG+HVRY0N9gsT42XpYn6L1+3p4NkOx8sqyu2fdiHBomP73sQ7EkuPAFaVET cvIc4TVT65dLDNrNYJ4mHAuiy+zCfDVVpIgwvjvXljuCjm/jSEHBiG2PtxNZoBPoCG5k c/8lhDtrWX4BaiRhk6QkHwgUSNL2NrInRdtoxt0D2bk73eg2CFEidS+WfRCOnF0AMfZj wqD1FEZKRuFEFZLx+JfrRIWRr5dg8Fz1LJem6AxvXEcGBLU9lqNlgw/Vc1FdxTfxA6Zd CZfaP1x3zxqZOKeyuqWUHR+msPnTd7iRFJszi+qu2qLxW1l6uYkjhQmpEXQPoPWfZwNZ IVQQ== 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; bh=doR454/mG0l4w47krMI91YqoR0A7eFI6vvJMPhUL4vo=; b=Sjj7ZLz4OzAPlrvDwdjN823UytP+70e+9ih6dO97vHKxVmVMPAwwkohL3MyTEi3VbB QyBWG+t0509ULR71sKPeqNsyOWusZQZw3+iS52C/97Oubm3PL9rLfz1v4aniuf4VGX5d /WmD6C1XoVTxu95UvdKkINhz39/kbIrB5hNcvcBTMqG/7oJj0GS5CrRa4tMbaBt5oAc8 N2r0PEqvUp0WeYlApmNEcRJ2hFQnzZvUW6rLuXpgVCc30wZwOh6kmD7Ys7DpVMY5OCTK zATz8+C7um5WmK/6OLDIXsCmALFKnwtsp0kggEQBavsMkRcgmOfvC+hJSrEaHqxOwdBn wEeQ== X-Gm-Message-State: AN3rC/6k2grgt9KQcOjqyEa5w8mGjbc4iIZC4ycQ2uq7KGXvTZ4T8uUX 9c7HTdvpexxWaQ== X-Received: by 10.36.23.84 with SMTP id 81mr2958607ith.14.1493152525222; Tue, 25 Apr 2017 13:35:25 -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 i11sm2041425itf.10.2017.04.25.13.35.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Apr 2017 13:35:24 -0700 (PDT) From: Trond Myklebust To: linux-nfs@vger.kernel.org Subject: [PATCH] NFS: Don't write back further requests if there is a pending write error Date: Tue, 25 Apr 2017 16:35:23 -0400 Message-Id: <20170425203523.37118-1-trond.myklebust@primarydata.com> X-Mailer: git-send-email 2.9.3 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 the server has already returned a fatal write error that the user has not yet received on this file, then don't write back the other pages. Instead, act as if they have been sent, and have returned with the same error. Signed-off-by: Trond Myklebust --- fs/nfs/write.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 95ac001b6fdf..2e654940478f 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -569,6 +569,18 @@ static void nfs_write_error_remove_page(struct nfs_page *req) nfs_release_request(req); } +static bool +nfs_error_is_fatal_on_server(int err) +{ + switch (err) { + case 0: + case -ERESTARTSYS: + case -EINTR: + return false; + } + return nfs_error_is_fatal(err); +} + /* * Find an associated nfs write request, and prepare to flush it out * May return an error if the user signalled nfs_wait_on_request(). @@ -591,6 +603,10 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio, WARN_ON_ONCE(test_bit(PG_CLEAN, &req->wb_flags)); ret = 0; + /* If there is a fatal error that covers this write, just exit */ + if (nfs_error_is_fatal_on_server(req->wb_context->error)) + goto out_launder; + if (!nfs_pageio_add_request(pgio, req)) { ret = pgio->pg_error; /* @@ -600,10 +616,8 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio, */ if (nfs_error_is_fatal(ret)) { nfs_context_set_write_error(req->wb_context, ret); - if (launder) { - nfs_write_error_remove_page(req); - goto out; - } + if (launder) + goto out_launder; } nfs_redirty_request(req); ret = -EAGAIN; @@ -612,6 +626,9 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio, NFSIOS_WRITEPAGES, 1); out: return ret; +out_launder: + nfs_write_error_remove_page(req); + return ret; } static int nfs_do_writepage(struct page *page, struct writeback_control *wbc,