This patch fixes the below stale magic info.

$ mkfs.btrfs -f test.img
btrfs-progs v5.10.1
See http://btrfs.wiki.kernel.org for more information.

Label:              (null)
UUID:               941d2db7-3ece-4090-8b22-c4ea548b5dae
Node size:          16384
Sector size:        4096
Filesystem size:    1.00GiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP              51.19MiB
  System:           DUP               8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Runtime features:
Checksum:           crc32c
Number of devices:  1
Devices:
   ID        SIZE  PATH
    1     1.00GiB  test.img

$ hexdump -s 0x10000 -n 128 -C test.img
00010000  81 29 94 0a 00 00 00 00  00 00 00 00 00 00 00 00  |.)..............|
00010010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00010020  94 1d 2d b7 3e ce 40 90  8b 22 c4 ea 54 8b 5d ae  |..-.>.@.."..T.].|
00010030  00 00 01 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00010040  5f 42 48 52 66 53 5f 4d  05 00 00 00 00 00 00 00  |_BHRfS_M........|
00010050  00 40 d2 01 00 00 00 00  00 40 50 01 00 00 00 00  |.@.......@P.....|
00010060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00010070  00 00 00 40 00 00 00 00  00 00 02 00 00 00 00 00  |...@............|
00010080

$ mkfs.f2fs -t 0 -f test.img

        F2FS-tools: mkfs.f2fs Ver: 1.14.0 (2020-12-28)

Info: Disable heap-based policy
Info: Debug level = 0
Info: Trim is disabled
Info: Segments per section = 1
Info: Sections per zone = 1
Info: sector size = 512
Info: total sectors = 2097152 (1024 MB)
Info: zone aligned segment0 blkaddr: 512
Info: format version with
  "Linux version 5.10.46-4rodete1-amd64 (glinux-t...@google.com) (gcc-10 
(Debian 10.2.1-6+build2) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 
2.35.2) #1 SMP Debian 5.10.46-4rodete1 (2021-08-20)"
Info: Overprovision ratio = 6.360%
Info: Overprovision segments = 68 (GC reserved = 39)
Info: format successful

$hexdump -s 0x10000 -n 128 -C test.img
00010000  c2 8a c8 26 00 00 00 00  00 00 00 00 00 00 00 00  |...&............|
00010010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00010020  92 ab 3f c6 b7 82 49 5e  93 23 e8 c9 e9 45 7d ac  |..?...I^.#...E}.|
00010030  00 00 01 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00010040  5f 42 48 52 66 53 5f 4d  05 00 00 00 00 00 00 00  |_BHRfS_M........|
00010050  00 40 d2 01 00 00 00 00  00 40 50 01 00 00 00 00  |.@.......@P.....|
00010060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00010070  00 00 00 40 00 00 00 00  00 00 02 00 00 00 00 00  |...@............|
00010080

--- After this patch ---
$ mkfs.f2fs -t 0 -f test.img

        F2FS-tools: mkfs.f2fs Ver: 1.14.0 (2020-12-28)

Info: Disable heap-based policy
Info: Debug level = 0
Info: Trim is disabled
        test.img appears to contain an existing filesystem (btrfs).
Info: Segments per section = 1
Info: Sections per zone = 1
Info: sector size = 512
Info: total sectors = 2097152 (1024 MB)
Info: zone aligned segment0 blkaddr: 512
Info: format version with
  "Linux version 5.10.46-4rodete1-amd64 (glinux-t...@google.com) (gcc-10 
(Debian 10.2.1-6+build2) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 
2.35.2) #1 SMP Debian 5.10.46-4rodete1 (2021-08-20)"
Info: Overprovision ratio = 6.360%
Info: Overprovision segments = 68 (GC reserved = 39)
Info: format successful

$ hexdump -s 0x10000 -n 128 -C test.img
00010000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00010080

Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org>
---

Change log from v1:
 - add error handlers
 - call f2fs_devs_are_umounted() followed by f2fs_get_device_info() to fix
   open(O_EXCL)

 fsck/main.c             |  2 +-
 include/f2fs_fs.h       |  1 +
 lib/libf2fs.c           |  6 ++++++
 mkfs/f2fs_format_main.c | 36 ++++++++++++++++++++++++++++++------
 4 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/fsck/main.c b/fsck/main.c
index eda399cf0679..e4cfdf443867 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -1120,7 +1120,7 @@ int main(int argc, char **argv)
        }
 
        /* Get device */
-       if (f2fs_get_device_info() < 0) {
+       if (f2fs_get_device_info() < 0 || f2fs_get_f2fs_info() < 0) {
                ret = -1;
                if (c.func == FSCK)
                        ret = FSCK_OPERATIONAL_ERROR;
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 2a9c1169456c..69260a6fccd9 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -1341,6 +1341,7 @@ extern int f2fs_devs_are_umounted(void);
 extern int f2fs_dev_is_writable(void);
 extern int f2fs_dev_is_umounted(char *);
 extern int f2fs_get_device_info(void);
+extern int f2fs_get_f2fs_info(void);
 extern unsigned int calc_extra_isize(void);
 extern int get_device_info(int);
 extern int f2fs_init_sparse_file(void);
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index b27785dec757..420dfdae56da 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -1183,6 +1183,12 @@ int f2fs_get_device_info(void)
        for (i = 0; i < c.ndevs; i++)
                if (get_device_info(i))
                        return -1;
+       return 0;
+}
+
+int f2fs_get_f2fs_info(void)
+{
+       int i;
 
        if (c.wanted_total_sectors < c.total_sectors) {
                MSG(0, "Info: total device sectors = %"PRIu64" (in %u bytes)\n",
diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
index 031244d5d67a..b89efe691a49 100644
--- a/mkfs/f2fs_format_main.c
+++ b/mkfs/f2fs_format_main.c
@@ -396,18 +396,42 @@ int main(int argc, char *argv[])
 
        c.func = MKFS;
 
-       if (!force_overwrite && f2fs_check_overwrite()) {
-               MSG(0, "\tUse the -f option to force overwrite.\n");
-               return -1;
-       }
-
        if (f2fs_devs_are_umounted() < 0) {
                if (errno != EBUSY)
                        MSG(0, "\tError: Not available on mounted device!\n");
-               return -1;
+               goto err_format;
        }
 
        if (f2fs_get_device_info() < 0)
+               return -1;
+
+       if (f2fs_check_overwrite()) {
+               char *zero_buf = NULL;
+               int i;
+
+               if (!force_overwrite) {
+                       MSG(0, "\tUse the -f option to force overwrite.\n");
+                       goto err_format;
+               }
+               zero_buf = calloc(F2FS_BLKSIZE, 1);
+               if (!zero_buf) {
+                       MSG(0, "\tError: Fail to allocate zero buffer.\n");
+                       goto err_format;
+               }
+               /* wipe out other FS magics mostly first 4MB space */
+               for (i = 0; i < 1024; i++)
+                       if (dev_fill_block(zero_buf, i))
+                               break;
+               free(zero_buf);
+               if (i != 1024) {
+                       MSG(0, "\tError: Fail to fill zeros till %d.\n", i);
+                       goto err_format;
+               }
+               if (f2fs_fsync_device())
+                       goto err_format;
+       }
+
+       if (f2fs_get_f2fs_info() < 0)
                goto err_format;
 
        /*
-- 
2.33.0.464.g1972c5931b-goog



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to