From: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <yuchao0@huawei.com>
Cc: nolange79@gmail.com, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH] fsck.f2fs: correct return value
Date: Mon, 17 Aug 2020 23:52:06 -0700 [thread overview]
Message-ID: <20200818065206.GA3751716@google.com> (raw)
In-Reply-To: <20200805080913.48133-1-yuchao0@huawei.com>
On 08/05, Chao Yu wrote:
> As Norbert Lange reported:
>
> "
> $ fsck.f2fs -a /dev/mmcblk0p5; echo $?
> Info: Fix the reported corruption.
> Info: Mounted device!
> Info: Check FS only on RO mounted device
> Error: Failed to open the device!
> 255
> "
>
> Michael Laß reminds:
>
> "
> I think the return value is exactly the problem here. See fsck(8) (
> https://linux.die.net/man/8/fsck) which specifies the return values.
> Systemd looks at these and decides how to proceed:
>
> https://github.com/systemd/systemd/blob/a859abf062cef1511e4879c4ee39c6036ebeaec8/src/fsck/fsck.c#L407
>
> That means, if fsck.f2fs returns 255, then
> the FSCK_SYSTEM_SHOULD_REBOOT bit is set and systemd will reboot.
> "
>
> So the problem here is fsck.f2fs didn't return correct value to userspace
> apps, result in later unexpected behavior of rebooting, let's fix this.
>
> Reported-by: Norbert Lange <nolange79@gmail.com>
> Reported-by: Michael Laß <bevan@bi-co.net>
> Signed-off-by: Chao Yu <yuchao0@huawei.com>
> ---
> fsck/fsck.h | 11 +++++++++++
> fsck/main.c | 27 +++++++++++++++++++++------
> 2 files changed, 32 insertions(+), 6 deletions(-)
>
> diff --git a/fsck/fsck.h b/fsck/fsck.h
> index e86730c34fc4..c5e85fefa07b 100644
> --- a/fsck/fsck.h
> +++ b/fsck/fsck.h
> @@ -13,6 +13,17 @@
>
> #include "f2fs.h"
>
> +enum {
> + FSCK_SUCCESS = 0,
> + FSCK_ERROR_CORRECTED = 1 << 0,
> + FSCK_SYSTEM_SHOULD_REBOOT = 1 << 1,
> + FSCK_ERRORS_LEFT_UNCORRECTED = 1 << 2,
> + FSCK_OPERATIONAL_ERROR = 1 << 3,
> + FSCK_USAGE_OR_SYNTAX_ERROR = 1 << 4,
> + FSCK_USER_CANCELLED = 1 << 5,
> + FSCK_SHARED_LIB_ERROR = 1 << 7,
> +};
> +
> struct quota_ctx;
>
> #define FSCK_UNMATCHED_EXTENT 0x00000001
> diff --git a/fsck/main.c b/fsck/main.c
> index 9a1596f35e79..11d472b9941c 100644
> --- a/fsck/main.c
> +++ b/fsck/main.c
> @@ -630,7 +630,7 @@ void f2fs_parse_options(int argc, char *argv[])
> error_out(prog);
> }
>
> -static void do_fsck(struct f2fs_sb_info *sbi)
> +static int do_fsck(struct f2fs_sb_info *sbi)
> {
> struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
> u32 flag = le32_to_cpu(ckpt->ckpt_flags);
> @@ -655,7 +655,7 @@ static void do_fsck(struct f2fs_sb_info *sbi)
> } else {
> MSG(0, "[FSCK] F2FS metadata [Ok..]");
> fsck_free(sbi);
> - return;
> + return FSCK_SUCCESS;
> }
>
> if (!c.ro)
> @@ -687,7 +687,7 @@ static void do_fsck(struct f2fs_sb_info *sbi)
> ret = quota_init_context(sbi);
> if (ret) {
> ASSERT_MSG("quota_init_context failure: %d", ret);
> - return;
> + return FSCK_OPERATIONAL_ERROR;
> }
> }
> fsck_chk_orphan_node(sbi);
> @@ -695,8 +695,14 @@ static void do_fsck(struct f2fs_sb_info *sbi)
> F2FS_FT_DIR, TYPE_INODE, &blk_cnt, NULL);
> fsck_chk_quota_files(sbi);
>
> - fsck_verify(sbi);
> + ret = fsck_verify(sbi);
> fsck_free(sbi);
> +
> + if (!c.bug_on)
> + return FSCK_SUCCESS;
> + if (!ret)
> + return FSCK_ERROR_CORRECTED;
I applied this to get FSCK_ERROR_CORRECTED.
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -3165,6 +3165,8 @@ int fsck_verify(struct f2fs_sb_info *sbi)
is_set_ckpt_flags(cp, CP_QUOTA_NEED_FSCK_FLAG)) {
write_checkpoints(sbi);
}
+ /* to return FSCK_ERROR_CORRECTED */
+ ret = 0;
}
return ret;
}
> + return FSCK_ERRORS_LEFT_UNCORRECTED;
> }
>
> static void do_dump(struct f2fs_sb_info *sbi)
> @@ -833,11 +839,15 @@ int main(int argc, char **argv)
> if (c.func != DUMP && f2fs_devs_are_umounted() < 0) {
> if (errno == EBUSY) {
> ret = -1;
> + if (c.func == FSCK)
> + ret = FSCK_OPERATIONAL_ERROR;
> goto quick_err;
> }
> if (!c.ro || c.func == DEFRAG) {
> MSG(0, "\tError: Not available on mounted device!\n");
> ret = -1;
> + if (c.func == FSCK)
> + ret = FSCK_OPERATIONAL_ERROR;
> goto quick_err;
> }
>
> @@ -854,6 +864,8 @@ int main(int argc, char **argv)
> /* Get device */
> if (f2fs_get_device_info() < 0) {
> ret = -1;
> + if (c.func == FSCK)
> + ret = FSCK_OPERATIONAL_ERROR;
> goto quick_err;
> }
>
> @@ -873,7 +885,7 @@ fsck_again:
>
> switch (c.func) {
> case FSCK:
> - do_fsck(sbi);
> + ret = do_fsck(sbi);
> break;
> #ifdef WITH_DUMP
> case DUMP:
> @@ -935,8 +947,11 @@ retry:
> }
> }
> ret = f2fs_finalize_device();
> - if (ret < 0)
> + if (ret) {
> + if (c.func == FSCK)
> + return FSCK_OPERATIONAL_ERROR;
> return ret;
> + }
>
> printf("\nDone: %lf secs\n", (get_boottime_ns() - start) / 1000000000.0);
> return 0;
> --
> 2.26.2
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2020-08-18 6:52 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-05 8:09 [f2fs-dev] [PATCH] fsck.f2fs: correct return value Chao Yu
2020-08-05 9:38 ` Norbert Lange
2020-08-05 21:59 ` Norbert Lange
2020-08-07 2:03 ` Chao Yu
2020-08-18 6:52 ` Jaegeuk Kim [this message]
2020-08-18 9:04 ` Chao Yu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200818065206.GA3751716@google.com \
--to=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=nolange79@gmail.com \
--cc=yuchao0@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.