From f2f1341ffe7172078ca8f99a7142392cd302ec60 Mon Sep 17 00:00:00 2001 From: Sheng Yong Date: Thu, 2 Nov 2017 11:56:09 +0800 Subject: [PATCH] fsck.f2fs: introduce new option --dry-run With --dry-run enabled, fsck.f2fs will do all checks and "fixes" except that all fixes will not be written to storage at last. Signed-off-by: Sheng Yong Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim --- fsck/main.c | 14 +++++++++++++- include/f2fs_fs.h | 1 + lib/libf2fs.c | 1 + lib/libf2fs_io.c | 3 +++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/fsck/main.c b/fsck/main.c index 4c4b6f4..2d24e5b 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -18,6 +18,7 @@ #include "fsck.h" #include #include +#include #include "quotaio.h" struct f2fs_fsck gfsck; @@ -31,6 +32,7 @@ void fsck_usage() MSG(0, " -f check/fix entire partition\n"); MSG(0, " -p preen mode [default:0 the same as -a [0|1]]\n"); MSG(0, " -t show directory tree\n"); + MSG(0, " --dry-run do not really fix corruptions\n"); exit(1); } @@ -118,10 +120,20 @@ void f2fs_parse_options(int argc, char *argv[]) if (!strcmp("fsck.f2fs", prog)) { const char *option_string = ":ad:fp:t"; + int opt = 0; + struct option long_opt[] = { + {"dry-run", no_argument, 0, 1}, + {0, 0, 0, 0} + }; c.func = FSCK; - while ((option = getopt(argc, argv, option_string)) != EOF) { + while ((option = getopt_long(argc, argv, option_string, + long_opt, &opt)) != EOF) { switch (option) { + case 1: + c.dry_run = 1; + MSG(0, "Info: Dry run\n"); + break; case 'a': c.auto_fix = 1; MSG(0, "Info: Fix the reported corruption.\n"); diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index b6e5f46..ecffeaa 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -309,6 +309,7 @@ struct f2fs_configuration { int trimmed; int func; void *private; + int dry_run; int fix_on; int bug_on; int auto_fix; diff --git a/lib/libf2fs.c b/lib/libf2fs.c index 69f5ccc..259bd17 100644 --- a/lib/libf2fs.c +++ b/lib/libf2fs.c @@ -598,6 +598,7 @@ void f2fs_init_configuration(void) c.trimmed = 0; c.ro = 0; c.kd = -1; + c.dry_run = 0; } static int is_mounted(const char *mpt, const char *device) diff --git a/lib/libf2fs_io.c b/lib/libf2fs_io.c index 50ff171..8a79672 100644 --- a/lib/libf2fs_io.c +++ b/lib/libf2fs_io.c @@ -129,6 +129,9 @@ int dev_write(void *buf, __u64 offset, size_t len) { int fd; + if (c.dry_run) + return 0; + if (c.sparse_mode) return dev_write_sparse(buf, offset, len);