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 <shengyo...@huawei.com>
Reviewed-by: Chao Yu <yuch...@huawei.com>
---
 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 93037e1..baa8efc 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -18,6 +18,7 @@
 #include "fsck.h"
 #include <libgen.h>
 #include <ctype.h>
+#include <getopt.h>
 
 struct f2fs_fsck gfsck;
 
@@ -30,6 +31,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);
 }
 
@@ -117,10 +119,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 e1e299d..64a796d 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -300,6 +300,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);
 
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to