w/ below testcase, resize will generate a corrupted image which
contains inconsistent metadata:

touch img
truncate -s $((512*1024*1024*1024)) img
mkfs.f2fs -f img $((256*1024*1024))
resize.f2fs -s img -t $((1024*1024*1024))
mount img /mnt/f2fs

[   31.725200] F2FS-fs (loop0): Wrong bitmap size: sit: 192, sit_blk_cnt:4762
[   31.728441] F2FS-fs (loop0): Failed to get valid F2FS checkpoint

The root cause is safe mode (via -s option) is not compatible
w/ expand resize, due to in safe mode, we will keep all parameters
related to NAT, SIT, SSA area, e.g. sit_bitmap_size, however, we
will update segment_count_main according new partition size, result
in there is no enough sit_bitmap and SIT blocks to address the
entire block address of new partition.

Adding a check condition to avoid expanding partition in safe
mode, and change manual accordingly.

Signed-off-by: Chao Yu <c...@kernel.org>
---
 fsck/resize.c     | 12 ++++++++----
 man/resize.f2fs.8 |  2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/fsck/resize.c b/fsck/resize.c
index 1ab7d75..58914ec 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -756,18 +756,22 @@ int f2fs_resize(struct f2fs_sb_info *sbi)
 
        /* may different sector size */
        if ((c.target_sectors * c.sector_size >>
-                       get_sb(log_blocksize)) < get_sb(block_count))
+                       get_sb(log_blocksize)) < get_sb(block_count)) {
                if (!c.safe_resize) {
                        ASSERT_MSG("Nothing to resize, now only supports 
resizing with safe resize flag\n");
                        return -1;
                } else {
                        return f2fs_resize_shrink(sbi);
                }
-       else if (((c.target_sectors * c.sector_size >>
+       } else if (((c.target_sectors * c.sector_size >>
                        get_sb(log_blocksize)) > get_sb(block_count)) ||
-                       c.ignore_error)
+                       c.ignore_error) {
+               if (c.safe_resize) {
+                       ASSERT_MSG("Expanding resize doesn't support safe 
resize flag");
+                       return -1;
+               }
                return f2fs_resize_grow(sbi);
-       else {
+       } else {
                MSG(0, "Nothing to resize.\n");
                return 0;
        }
diff --git a/man/resize.f2fs.8 b/man/resize.f2fs.8
index bdda4fd..5b6daf5 100644
--- a/man/resize.f2fs.8
+++ b/man/resize.f2fs.8
@@ -69,7 +69,7 @@ Skip caution dialogue and resize partition directly.
 Specify support write hint.
 .TP
 .BI \-s
-Enable safe resize.
+Enable safe resize, it can only be used w/ shrink resize.
 .TP
 .BI \-V
 Print the version number and exit.
-- 
2.49.0



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

Reply via email to