diff mbox series

[f2fs-dev] resize.f2fs: fix to always change metadata for expand resize

Message ID 20250414111141.735081-1-chao@kernel.org (mailing list archive)
State New
Headers show
Series [f2fs-dev] resize.f2fs: fix to always change metadata for expand resize | expand

Commit Message

Chao Yu April 14, 2025, 11:11 a.m. UTC
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 <chao@kernel.org>
---
 fsck/resize.c     | 12 ++++++++----
 man/resize.f2fs.8 |  2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

Comments

Juhyung Park April 15, 2025, 7:28 p.m. UTC | #1
Hm.

Would this be what @uplinkr might have encountered?

On Mon, Apr 14, 2025 at 4:13 AM Chao Yu via Linux-f2fs-devel
<linux-f2fs-devel@lists.sourceforge.net> wrote:
>
> 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 <chao@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
Chao Yu April 16, 2025, 3:33 a.m. UTC | #2
On 4/16/25 03:28, Juhyung Park wrote:
> Hm.
> 
> Would this be what @uplinkr might have encountered?

Maybe, :)

@uplinkr, previously, if you used '-s' parameter while expand-resizing,
that could be the reason it corrupted your partition.

Thanks,

> 
> On Mon, Apr 14, 2025 at 4:13 AM Chao Yu via Linux-f2fs-devel
> <linux-f2fs-devel@lists.sourceforge.net> wrote:
>>
>> 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 <chao@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
Juhyung Park April 16, 2025, 3:40 a.m. UTC | #3
Just checked gparted's source code:
https://github.com/GNOME/gparted/blob/GPARTED_1_7_0/src/f2fs.cc#L135

Seems unlikely. :/

On Tue, Apr 15, 2025 at 8:34 PM Chao Yu <chao@kernel.org> wrote:
>
> On 4/16/25 03:28, Juhyung Park wrote:
> > Hm.
> >
> > Would this be what @uplinkr might have encountered?
>
> Maybe, :)
>
> @uplinkr, previously, if you used '-s' parameter while expand-resizing,
> that could be the reason it corrupted your partition.
>
> Thanks,
>
> >
> > On Mon, Apr 14, 2025 at 4:13 AM Chao Yu via Linux-f2fs-devel
> > <linux-f2fs-devel@lists.sourceforge.net> wrote:
> >>
> >> 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 <chao@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
>
Chao Yu April 16, 2025, 5:51 a.m. UTC | #4
On 4/16/25 11:40, Juhyung Park wrote:
> Just checked gparted's source code:
> https://github.com/GNOME/gparted/blob/GPARTED_1_7_0/src/f2fs.cc#L135
> 
> Seems unlikely. :/

Alright, seems still we need another testcase for reproducing. :(

Thanks,

> 
> On Tue, Apr 15, 2025 at 8:34 PM Chao Yu <chao@kernel.org> wrote:
>>
>> On 4/16/25 03:28, Juhyung Park wrote:
>>> Hm.
>>>
>>> Would this be what @uplinkr might have encountered?
>>
>> Maybe, :)
>>
>> @uplinkr, previously, if you used '-s' parameter while expand-resizing,
>> that could be the reason it corrupted your partition.
>>
>> Thanks,
>>
>>>
>>> On Mon, Apr 14, 2025 at 4:13 AM Chao Yu via Linux-f2fs-devel
>>> <linux-f2fs-devel@lists.sourceforge.net> wrote:
>>>>
>>>> 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 <chao@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
>>
diff mbox series

Patch

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.