|
@@ -1,195 +0,0 @@
|
|
|
-From eee12fe5e2e6c5f71bc7cbe25a608b730fd5362e Mon Sep 17 00:00:00 2001
|
|
|
-From: Chao Yu <yuchao0@huawei.com>
|
|
|
-Date: Fri, 7 Aug 2020 10:02:31 +0800
|
|
|
-Subject: [PATCH] fsck.f2fs: correct return value
|
|
|
-MIME-Version: 1.0
|
|
|
-Content-Type: text/plain; charset=UTF-8
|
|
|
-Content-Transfer-Encoding: 8bit
|
|
|
-
|
|
|
-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>
|
|
|
-Signed-off-by: Norbert Lange <nolange79@gmail.com>
|
|
|
----
|
|
|
- fsck/fsck.h | 11 +++++++++++
|
|
|
- fsck/main.c | 45 +++++++++++++++++++++++++++++++--------------
|
|
|
- 2 files changed, 42 insertions(+), 14 deletions(-)
|
|
|
-
|
|
|
-diff --git a/fsck/fsck.h b/fsck/fsck.h
|
|
|
-index ccf4a39..c8aeb06 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 8c62a14..b0f2ec3 100644
|
|
|
---- a/fsck/main.c
|
|
|
-+++ b/fsck/main.c
|
|
|
-@@ -591,7 +591,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);
|
|
|
-@@ -614,7 +614,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)
|
|
|
-@@ -646,7 +646,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);
|
|
|
-@@ -654,8 +654,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;
|
|
|
-+ return FSCK_ERRORS_LEFT_UNCORRECTED;
|
|
|
- }
|
|
|
-
|
|
|
- static void do_dump(struct f2fs_sb_info *sbi)
|
|
|
-@@ -763,7 +769,7 @@ static int do_sload(struct f2fs_sb_info *sbi)
|
|
|
- int main(int argc, char **argv)
|
|
|
- {
|
|
|
- struct f2fs_sb_info *sbi;
|
|
|
-- int ret = 0;
|
|
|
-+ int ret = 0, ret2;
|
|
|
- clock_t start = clock();
|
|
|
-
|
|
|
- f2fs_init_configuration();
|
|
|
-@@ -771,10 +777,15 @@ int main(int argc, char **argv)
|
|
|
- f2fs_parse_options(argc, argv);
|
|
|
-
|
|
|
- if (c.func != DUMP && f2fs_devs_are_umounted() < 0) {
|
|
|
-- if (errno == EBUSY)
|
|
|
-+ if (errno == EBUSY) {
|
|
|
-+ if (c.func == FSCK)
|
|
|
-+ return FSCK_OPERATIONAL_ERROR;
|
|
|
- return -1;
|
|
|
-+ }
|
|
|
- if (!c.ro || c.func == DEFRAG) {
|
|
|
- MSG(0, "\tError: Not available on mounted device!\n");
|
|
|
-+ if (c.func == FSCK)
|
|
|
-+ return FSCK_OPERATIONAL_ERROR;
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
-@@ -789,8 +800,11 @@ int main(int argc, char **argv)
|
|
|
- }
|
|
|
-
|
|
|
- /* Get device */
|
|
|
-- if (f2fs_get_device_info() < 0)
|
|
|
-+ if (f2fs_get_device_info() < 0) {
|
|
|
-+ if (c.func == FSCK)
|
|
|
-+ return FSCK_OPERATIONAL_ERROR;
|
|
|
- return -1;
|
|
|
-+ }
|
|
|
-
|
|
|
- fsck_again:
|
|
|
- memset(&gfsck, 0, sizeof(gfsck));
|
|
|
-@@ -808,7 +822,7 @@ fsck_again:
|
|
|
-
|
|
|
- switch (c.func) {
|
|
|
- case FSCK:
|
|
|
-- do_fsck(sbi);
|
|
|
-+ ret = do_fsck(sbi);
|
|
|
- break;
|
|
|
- #ifdef WITH_DUMP
|
|
|
- case DUMP:
|
|
|
-@@ -856,8 +870,8 @@ fsck_again:
|
|
|
- char ans[255] = {0};
|
|
|
- retry:
|
|
|
- printf("Do you want to fix this partition? [Y/N] ");
|
|
|
-- ret = scanf("%s", ans);
|
|
|
-- ASSERT(ret >= 0);
|
|
|
-+ ret2 = scanf("%s", ans);
|
|
|
-+ ASSERT(ret2 >= 0);
|
|
|
- if (!strcasecmp(ans, "y"))
|
|
|
- c.fix_on = 1;
|
|
|
- else if (!strcasecmp(ans, "n"))
|
|
|
-@@ -869,12 +883,15 @@ retry:
|
|
|
- goto fsck_again;
|
|
|
- }
|
|
|
- }
|
|
|
-- ret = f2fs_finalize_device();
|
|
|
-- if (ret < 0)
|
|
|
-- return ret;
|
|
|
-+ ret2 = f2fs_finalize_device();
|
|
|
-+ if (ret2) {
|
|
|
-+ if (c.func == FSCK)
|
|
|
-+ return FSCK_OPERATIONAL_ERROR;
|
|
|
-+ return ret2;
|
|
|
-+ }
|
|
|
-
|
|
|
- printf("\nDone: %lf secs\n", (clock() - start) / (double)CLOCKS_PER_SEC);
|
|
|
-- return 0;
|
|
|
-+ return ret;
|
|
|
-
|
|
|
- out_err:
|
|
|
- if (sbi->ckpt)
|
|
|
---
|
|
|
-2.27.0
|
|
|
-
|