Message ID | 20230105233908.1030651-1-jaegeuk@kernel.org |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp559766wrt; Thu, 5 Jan 2023 16:18:52 -0800 (PST) X-Google-Smtp-Source: AMrXdXuDWc4dN1ccUwfPVHIC87JKn7bmKpKHA4wRY+eLggObXDbOUA+faYHDSdH9Gn4Q8uQuQkjs X-Received: by 2002:a17:903:32cc:b0:189:129e:92af with SMTP id i12-20020a17090332cc00b00189129e92afmr77945455plr.14.1672964332155; Thu, 05 Jan 2023 16:18:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672964332; cv=none; d=google.com; s=arc-20160816; b=dlqZSI9sYucNWv1DWgn/bzt2Di7KOjP+N6vI6CoI3g7yGuBFVy19cOwKh7iiKyugQ5 lcw0haL4GlJnNN7Q0rk/MuYHbTlfbXlAXIyNvQQrShb9L5CEtVgV1Smxslxq61wpqS/3 P0E5Aagu6Ad7TKYyc05NXELMp3SPgyW7idLT5tEb/pxMi9DUiQTJNBbiVxMVQDgGwAQz eC4ElHTH8EWMcVB0zFuOo9g7CAv1XojsOivaJb2xOT+fY8W9q4/Z8kP8uL6cHdjOULjp MoMCHXYhRJVJ6SQMaQ2FaubB1X9imt9bT2wCA+WAtQjGFXmVZu4TdsFmzqOh+sPk/wgJ JaGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=rjGczAJyQRL7BmyHPUbOFaJ9k11bk4Df8A7L4oXqu5Y=; b=FQml7uOL13aVV/I5wvtA1LsaQKLxVLalDnLw//uO5lSUAayO6bOH39X1IppXlccmyn us2y1W+0eo3UdhfE+wPLsy8cT1g3sXAzPq/V3RI21KiFBFhQFXgr/wojFp+mQ5lPAVky qSVDbjIrL3yiFY9huCHnYrtiMt4vEZyZpaH+EOSfrRiaI4SO6aVSh9qQZDd6gJClcFA+ HZ/gZ4kwvgwc7+9e7EplkIHD3frDzwhuoTPlkXU+/a0yLykw53IkFNXJbxHc8P/gyBzf 5iWgRkYK44KNAGWx9SQz+cOLPckVDDGlwnGTSOgPohiHD4d5clFsmB2F87xRSiL1ICnO p9Bg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="RkwH/Eqh"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d3-20020a170903230300b0018862b71d11si40095614plh.381.2023.01.05.16.18.40; Thu, 05 Jan 2023 16:18:52 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="RkwH/Eqh"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236679AbjAEXmD (ORCPT <rfc822;tmhikaru@gmail.com> + 99 others); Thu, 5 Jan 2023 18:42:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58330 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236589AbjAEXlf (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 5 Jan 2023 18:41:35 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0EDED6D369; Thu, 5 Jan 2023 15:40:02 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 5B2B961C63; Thu, 5 Jan 2023 23:39:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B427FC433EF; Thu, 5 Jan 2023 23:39:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1672961954; bh=k2zX9ykuOQxejXRAE9f9jXrb0X06NknQnoJI39Wq2uI=; h=From:To:Cc:Subject:Date:From; b=RkwH/EqhZCJwBqJ5dkkcznlUnfj0cVy4Vc5roj2yb6DV6v450qdmWWY82DXxfL2gO GzWaq9cBVm7S6ZVy6/tSST7LMTtnQHM8HclV5zAjIxVvzuf63z4FlPDiqwRYSO9Bdd 5/C4za4dfgHKapnAjjb6s90lDCduK2kyBbh2vdqeFezcPxmoamxf1IjtUhqKbe9Hpl 45cCz9/cpqUQlQHYuKMZEcLGwsrNL95qjQphh6bp4Q719DgeXSBmdOdpovtL6C2+Fe Mr9vkj7pPCJH88S5c7hJAU+fknDB8E1rmObSfmmP820uTZs77a1zBxUJpoSfmbqK4p 1VQOffNJb7PSA== From: Jaegeuk Kim <jaegeuk@kernel.org> To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Cc: Jaegeuk Kim <jaegeuk@kernel.org>, stable@vger.kernel.org, Randall Huang <huangrandall@google.com> Subject: [PATCH] f2fs: retry to update the inode page given EIO Date: Thu, 5 Jan 2023 15:39:08 -0800 Message-Id: <20230105233908.1030651-1-jaegeuk@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1754230247440180291?= X-GMAIL-MSGID: =?utf-8?q?1754230247440180291?= |
Series |
f2fs: retry to update the inode page given EIO
|
|
Commit Message
Jaegeuk Kim
Jan. 5, 2023, 11:39 p.m. UTC
In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. As a result, we don't need to stop checkpoint right away given single EIO. Cc: stable@vger.kernel.org Signed-off-by: Randall Huang <huangrandall@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- fs/f2fs/inode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Comments
In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. As a result, we don't need to stop checkpoint right away given single EIO. Cc: stable@vger.kernel.org Signed-off-by: Randall Huang <huangrandall@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- Change log from v1: - fix a bug fs/f2fs/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index ff6cf66ed46b..2ed7a621fdf1 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) if (IS_ERR(node_page)) { int err = PTR_ERR(node_page); - if (err == -ENOMEM) { + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { cond_resched(); goto retry; } else if (err != -ENOENT) {
On 2023/1/11 9:20, Jaegeuk Kim wrote: > In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with > f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. > As a result, we don't need to stop checkpoint right away given single EIO. f2fs_handle_page_eio() only covers the case that EIO occurs on the same page, should we cover the case EIO occurs on different pages? Thanks, > > Cc: stable@vger.kernel.org > Signed-off-by: Randall Huang <huangrandall@google.com> > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > --- > > Change log from v1: > - fix a bug > > fs/f2fs/inode.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c > index ff6cf66ed46b..2ed7a621fdf1 100644 > --- a/fs/f2fs/inode.c > +++ b/fs/f2fs/inode.c > @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) > if (IS_ERR(node_page)) { > int err = PTR_ERR(node_page); > > - if (err == -ENOMEM) { > + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { > cond_resched(); > goto retry; > } else if (err != -ENOENT) {
On 01/11, Chao Yu wrote: > On 2023/1/11 9:20, Jaegeuk Kim wrote: > > In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with > > f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. > > As a result, we don't need to stop checkpoint right away given single EIO. > > f2fs_handle_page_eio() only covers the case that EIO occurs on the same > page, should we cover the case EIO occurs on different pages? Which case are you looking at? > > Thanks, > > > > > Cc: stable@vger.kernel.org > > Signed-off-by: Randall Huang <huangrandall@google.com> > > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > > --- > > > > Change log from v1: > > - fix a bug > > > > fs/f2fs/inode.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c > > index ff6cf66ed46b..2ed7a621fdf1 100644 > > --- a/fs/f2fs/inode.c > > +++ b/fs/f2fs/inode.c > > @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) > > if (IS_ERR(node_page)) { > > int err = PTR_ERR(node_page); > > - if (err == -ENOMEM) { > > + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { > > cond_resched(); > > goto retry; > > } else if (err != -ENOENT) {
In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. As a result, we don't need to stop checkpoint right away given single EIO. Cc: stable@vger.kernel.org Signed-off-by: Randall Huang <huangrandall@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> --- Change log from v2: - set EIO to cover the case of data corruption given by buggy UFS driver fs/f2fs/inode.c | 2 +- fs/f2fs/node.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index ff6cf66ed46b..2ed7a621fdf1 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) if (IS_ERR(node_page)) { int err = PTR_ERR(node_page); - if (err == -ENOMEM) { + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { cond_resched(); goto retry; } else if (err != -ENOENT) { diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 558b318f7316..1629dc300c61 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1455,7 +1455,7 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid, ofs_of_node(page), cpver_of_node(page), next_blkaddr_of_node(page)); set_sbi_flag(sbi, SBI_NEED_FSCK); - err = -EINVAL; + err = -EIO; out_err: ClearPageUptodate(page); out_put_err:
On 2023/1/12 2:50, Jaegeuk Kim wrote: > On 01/11, Chao Yu wrote: >> On 2023/1/11 9:20, Jaegeuk Kim wrote: >>> In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with >>> f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. >>> As a result, we don't need to stop checkpoint right away given single EIO. >> >> f2fs_handle_page_eio() only covers the case that EIO occurs on the same >> page, should we cover the case EIO occurs on different pages? > > Which case are you looking at? - __get_node_page(PageA) - __get_node_page(PageB) - f2fs_handle_page_eio - sbi->page_eio_ofs[type] = PageA->index - f2fs_handle_page_eio - sbi->page_eio_ofs[type] = PageB->index In such race case, it may has low probability to set CP_ERROR_FLAG as we expect? Thanks, > >> >> Thanks, >> >>> >>> Cc: stable@vger.kernel.org >>> Signed-off-by: Randall Huang <huangrandall@google.com> >>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> >>> --- >>> >>> Change log from v1: >>> - fix a bug >>> >>> fs/f2fs/inode.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c >>> index ff6cf66ed46b..2ed7a621fdf1 100644 >>> --- a/fs/f2fs/inode.c >>> +++ b/fs/f2fs/inode.c >>> @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) >>> if (IS_ERR(node_page)) { >>> int err = PTR_ERR(node_page); >>> - if (err == -ENOMEM) { >>> + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { >>> cond_resched(); >>> goto retry; >>> } else if (err != -ENOENT) {
On 01/12, Chao Yu wrote: > On 2023/1/12 2:50, Jaegeuk Kim wrote: > > On 01/11, Chao Yu wrote: > > > On 2023/1/11 9:20, Jaegeuk Kim wrote: > > > > In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with > > > > f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. > > > > As a result, we don't need to stop checkpoint right away given single EIO. > > > > > > f2fs_handle_page_eio() only covers the case that EIO occurs on the same > > > page, should we cover the case EIO occurs on different pages? > > > > Which case are you looking at? > > - __get_node_page(PageA) - __get_node_page(PageB) > - f2fs_handle_page_eio > - sbi->page_eio_ofs[type] = PageA->index > - f2fs_handle_page_eio > - sbi->page_eio_ofs[type] = PageB->index > > In such race case, it may has low probability to set CP_ERROR_FLAG as we expect? Do you see that case in products? I'm trying to avoid setting CP_ERROR_FLAG here. > > Thanks, > > > > > > > > > Thanks, > > > > > > > > > > > Cc: stable@vger.kernel.org > > > > Signed-off-by: Randall Huang <huangrandall@google.com> > > > > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > > > > --- > > > > > > > > Change log from v1: > > > > - fix a bug > > > > > > > > fs/f2fs/inode.c | 2 +- > > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > > > diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c > > > > index ff6cf66ed46b..2ed7a621fdf1 100644 > > > > --- a/fs/f2fs/inode.c > > > > +++ b/fs/f2fs/inode.c > > > > @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) > > > > if (IS_ERR(node_page)) { > > > > int err = PTR_ERR(node_page); > > > > - if (err == -ENOMEM) { > > > > + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { > > > > cond_resched(); > > > > goto retry; > > > > } else if (err != -ENOENT) {
On 2023/1/13 8:01, Jaegeuk Kim wrote: > On 01/12, Chao Yu wrote: >> On 2023/1/12 2:50, Jaegeuk Kim wrote: >>> On 01/11, Chao Yu wrote: >>>> On 2023/1/11 9:20, Jaegeuk Kim wrote: >>>>> In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with >>>>> f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. >>>>> As a result, we don't need to stop checkpoint right away given single EIO. >>>> >>>> f2fs_handle_page_eio() only covers the case that EIO occurs on the same >>>> page, should we cover the case EIO occurs on different pages? >>> >>> Which case are you looking at? >> >> - __get_node_page(PageA) - __get_node_page(PageB) >> - f2fs_handle_page_eio >> - sbi->page_eio_ofs[type] = PageA->index >> - f2fs_handle_page_eio >> - sbi->page_eio_ofs[type] = PageB->index >> >> In such race case, it may has low probability to set CP_ERROR_FLAG as we expect? > > Do you see that case in products? Not yet. > I'm trying to avoid setting CP_ERROR_FLAG here. Copied, how about using the same logic for node page as meta page, like we did in f2fs_get_meta_page_retry()? Thanks, > >> >> Thanks, >> >>> >>>> >>>> Thanks, >>>> >>>>> >>>>> Cc: stable@vger.kernel.org >>>>> Signed-off-by: Randall Huang <huangrandall@google.com> >>>>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> >>>>> --- >>>>> >>>>> Change log from v1: >>>>> - fix a bug >>>>> >>>>> fs/f2fs/inode.c | 2 +- >>>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>>> >>>>> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c >>>>> index ff6cf66ed46b..2ed7a621fdf1 100644 >>>>> --- a/fs/f2fs/inode.c >>>>> +++ b/fs/f2fs/inode.c >>>>> @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) >>>>> if (IS_ERR(node_page)) { >>>>> int err = PTR_ERR(node_page); >>>>> - if (err == -ENOMEM) { >>>>> + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { >>>>> cond_resched(); >>>>> goto retry; >>>>> } else if (err != -ENOENT) {
If the storage gives a corrupted node block due to short power failure and
reset, f2fs stops the entire operations by setting the checkpoint failure flag.
Let's give more chances to live by re-issuing IOs for a while in such critical
path.
Cc: stable@vger.kernel.org
Suggested-by: Randall Huang <huangrandall@google.com>
Suggested-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
Change log from v2:
- adopting the retry logic
fs/f2fs/inode.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index e1d6e021e82b..7bf660d4cad9 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -724,18 +724,19 @@ void f2fs_update_inode_page(struct inode *inode)
{
struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
struct page *node_page;
+ int count = 0;
retry:
node_page = f2fs_get_node_page(sbi, inode->i_ino);
if (IS_ERR(node_page)) {
int err = PTR_ERR(node_page);
- if (err == -ENOMEM) {
- cond_resched();
+ /* The node block was truncated. */
+ if (err == -ENOENT)
+ return;
+
+ if (err == -ENOMEM || ++count <= DEFAULT_RETRY_IO_COUNT)
goto retry;
- } else if (err != -ENOENT) {
- f2fs_stop_checkpoint(sbi, false,
- STOP_CP_REASON_UPDATE_INODE);
- }
+ f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_UPDATE_INODE);
return;
}
f2fs_update_inode(inode, node_page);
On 01/28, Chao Yu wrote: > On 2023/1/13 8:01, Jaegeuk Kim wrote: > > On 01/12, Chao Yu wrote: > > > On 2023/1/12 2:50, Jaegeuk Kim wrote: > > > > On 01/11, Chao Yu wrote: > > > > > On 2023/1/11 9:20, Jaegeuk Kim wrote: > > > > > > In f2fs_update_inode_page, f2fs_get_node_page handles EIO along with > > > > > > f2fs_handle_page_eio that stops checkpoint, if the disk couldn't be recovered. > > > > > > As a result, we don't need to stop checkpoint right away given single EIO. > > > > > > > > > > f2fs_handle_page_eio() only covers the case that EIO occurs on the same > > > > > page, should we cover the case EIO occurs on different pages? > > > > > > > > Which case are you looking at? > > > > > > - __get_node_page(PageA) - __get_node_page(PageB) > > > - f2fs_handle_page_eio > > > - sbi->page_eio_ofs[type] = PageA->index > > > - f2fs_handle_page_eio > > > - sbi->page_eio_ofs[type] = PageB->index > > > > > > In such race case, it may has low probability to set CP_ERROR_FLAG as we expect? > > > > Do you see that case in products? > > Not yet. > > > I'm trying to avoid setting CP_ERROR_FLAG here. > > Copied, how about using the same logic for node page as meta page, like > we did in f2fs_get_meta_page_retry()? Yeah.. let me send v3 and test a bit. Thanks~ :) > > Thanks, > > > > > > > > > Thanks, > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > > > Cc: stable@vger.kernel.org > > > > > > Signed-off-by: Randall Huang <huangrandall@google.com> > > > > > > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> > > > > > > --- > > > > > > > > > > > > Change log from v1: > > > > > > - fix a bug > > > > > > > > > > > > fs/f2fs/inode.c | 2 +- > > > > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > > > > > > > diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c > > > > > > index ff6cf66ed46b..2ed7a621fdf1 100644 > > > > > > --- a/fs/f2fs/inode.c > > > > > > +++ b/fs/f2fs/inode.c > > > > > > @@ -719,7 +719,7 @@ void f2fs_update_inode_page(struct inode *inode) > > > > > > if (IS_ERR(node_page)) { > > > > > > int err = PTR_ERR(node_page); > > > > > > - if (err == -ENOMEM) { > > > > > > + if (err == -ENOMEM || (err == -EIO && !f2fs_cp_error(sbi))) { > > > > > > cond_resched(); > > > > > > goto retry; > > > > > > } else if (err != -ENOENT) {
On 2023/1/31 7:30, Jaegeuk Kim wrote: > If the storage gives a corrupted node block due to short power failure and > reset, f2fs stops the entire operations by setting the checkpoint failure flag. > > Let's give more chances to live by re-issuing IOs for a while in such critical > path. > > Cc: stable@vger.kernel.org > Suggested-by: Randall Huang <huangrandall@google.com> > Suggested-by: Chao Yu <chao@kernel.org> > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Reviewed-by: Chao Yu <chao@kernel.org> Thanks,
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 01b9e6f85f6b..66e407fcefd3 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -719,10 +719,10 @@ void f2fs_update_inode_page(struct inode *inode) if (IS_ERR(node_page)) { int err = PTR_ERR(node_page); - if (err == -ENOMEM) { + if (err == -ENOMEM || err == -EIO) { cond_resched(); goto retry; - } else if (err != -ENOENT) { + } else if (err != -ENOENT || f2fs_cp_error(sbi)) { f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_UPDATE_INODE); }