FAILED: patch "[PATCH] f2fs: fix to reset all pinned status during fggc" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 2b8704b6a8b2896ccad1f5941d9a3e2c5031a470
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090944-reprint-spruce-0599@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2b8704b6a8b2896ccad1f5941d9a3e2c5031a470 Mon Sep 17 00:00:00 2001
From: Chao Yu <[email protected]>
Date: Mon, 17 Aug 2026 02:39:27 +0000
Subject: [PATCH] f2fs: fix to reset all pinned status during fggc
Otherwise, the pinned status may affect latter flow of fggc.
fs/f2fs/gc.c +3 -0
@@ -2183,6 +2183,9 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi,do_garbage_collect (sbi, segno, &gc_list,FG_GC , true, false);put_gc_inode (&gc_list); +/* reset all pinned status during fggc */ +f2fs_unpin_all_sections (sbi, true); +if (!dry_run &&get_valid_blocks (sbi, segno, true)) { err = -EAGAIN ; goto next;
Sasha Levin
maintainerPATCH 1/4 Revert: "f2fs: check in-memory block bitmap"
From: Chao Yu <[email protected]>
[ Upstream commit a2b251259bf2bdf550893bac078e9ce0a10e76c9 ]
Commit 355e78913c0d ("f2fs: check in-memory block bitmap") added a mirror for valid block bitmap, it expects to detect in-memory corruption, however we never got any reports from the check points for almost decade, let's remove the code, it can help to save memories.
Stable-dep-of: 2b8704b6a8b2 ("f2fs: fix to reset all pinned status during fggc")
--- fs/f2fs/segment.c | 38 -------------------------------------- fs/f2fs/segment.h | 6 ------ 2 files changed, 44 deletions(-)
fs/f2fs/segment.c +0 -38
@@ -2459,9 +2459,6 @@ static int update_sit_entry_for_release(struct f2fs_sb_info *sbi, struct seg_ent unsigned int segno, block_t blkaddr, unsigned int offset, int del) { bool exist; -#ifdef CONFIG_F2FS_CHECK_FS -bool mir_exist; -#endif int i;int del_count = -del;
@@ -2469,15 +2466,6 @@ static int update_sit_entry_for_release(struct f2fs_sb_info *sbi, struct seg_entfor (i =0 ; i < del_count; i++) { exist =f2fs_test_and_clear_bit (offset + i, se->cur_valid_map); -#ifdef CONFIG_F2FS_CHECK_FS - mir_exist =f2fs_test_and_clear_bit (offset + i, - se->cur_valid_map_mir); -if (unlikely (exist != mir_exist)) { -f2fs_err (sbi,"Inconsistent error when clearing bitmap, blk:%u, old bit:%d" , - blkaddr + i, exist); -f2fs_bug_on (sbi,1 ); - } -#endif if (unlikely (!exist)) {f2fs_err (sbi,"Bitmap was wrongly cleared, blk:%u" , blkaddr + i);f2fs_bug_on (sbi,1 );
@@ -2518,20 +2506,8 @@ static int update_sit_entry_for_alloc(struct f2fs_sb_info *sbi, struct seg_entry unsigned int segno, block_t blkaddr, unsigned int offset, int del) { bool exist; -#ifdef CONFIG_F2FS_CHECK_FS -bool mir_exist; -#endif exist =f2fs_test_and_set_bit (offset, se->cur_valid_map); -#ifdef CONFIG_F2FS_CHECK_FS - mir_exist =f2fs_test_and_set_bit (offset, - se->cur_valid_map_mir); -if (unlikely (exist != mir_exist)) { -f2fs_err (sbi,"Inconsistent error when setting bitmap, blk:%u, old bit:%d" , - blkaddr, exist); -f2fs_bug_on (sbi,1 ); - } -#endif if (unlikely (exist)) {f2fs_err (sbi,"Bitmap was wrongly set, blk:%u" , blkaddr);f2fs_bug_on (sbi,1 );
@@ -4759,11 +4735,6 @@ void f2fs_flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)int offset, sit_offset; se =get_seg_entry (sbi, segno); -#ifdef CONFIG_F2FS_CHECK_FS -if (memcmp (se->cur_valid_map, se->cur_valid_map_mir, -SIT_VBLOCK_MAP_SIZE )) -f2fs_bug_on (sbi,1 ); -#endif /* add discard candidates */ if (!(cpc->reason &CP_DISCARD )) {
@@ -4854,11 +4825,7 @@ static int build_sit_info(struct f2fs_sb_info *sbi)if (!sit_i->dirty_sentries_bitmap)return -ENOMEM ; -#ifdef CONFIG_F2FS_CHECK_FS - bitmap_size =MAIN_SEGS (sbi) *SIT_VBLOCK_MAP_SIZE * (3 + discard_map); -#else bitmap_size =MAIN_SEGS (sbi) *SIT_VBLOCK_MAP_SIZE * (2 + discard_map); -#endif sit_i->bitmap =f2fs_kvzalloc (sbi, bitmap_size,GFP_KERNEL );if (!sit_i->bitmap)return -ENOMEM ;
@@ -4872,11 +4839,6 @@ static int build_sit_info(struct f2fs_sb_info *sbi) sit_i->sentries[start].ckpt_valid_map = bitmap; bitmap +=SIT_VBLOCK_MAP_SIZE ; -#ifdef CONFIG_F2FS_CHECK_FS - sit_i->sentries[start].cur_valid_map_mir = bitmap; - bitmap +=SIT_VBLOCK_MAP_SIZE ; -#endif -if (discard_map) { sit_i->sentries[start].discard_map = bitmap; bitmap +=SIT_VBLOCK_MAP_SIZE ;
fs/f2fs/segment.h +0 -6
@@ -172,9 +172,6 @@ struct seg_entry { unsigned int ckpt_valid_blocks:10; /* # of valid blocks last cp */ unsigned int padding:6; /* padding */unsigned char *cur_valid_map;/* validity bitmap of blocks */ -#ifdef CONFIG_F2FS_CHECK_FS -unsigned char *cur_valid_map_mir;/* mirror of current valid bitmap */ -#endif /* * # of valid blocks and the validity bitmap stored in the last * checkpoint pack. This information is used by the SSR mode.
@@ -403,9 +400,6 @@ static inline void seg_info_from_raw_sit(struct seg_entry *se, se->ckpt_valid_blocks =GET_SIT_VBLOCKS (rs);memcpy (se->cur_valid_map, rs->valid_map,SIT_VBLOCK_MAP_SIZE );memcpy (se->ckpt_valid_map, rs->valid_map,SIT_VBLOCK_MAP_SIZE ); -#ifdef CONFIG_F2FS_CHECK_FS -memcpy (se->cur_valid_map_mir, rs->valid_map,SIT_VBLOCK_MAP_SIZE ); -#endif se->type =GET_SIT_TYPE (rs); se->mtime =le64_to_cpu (rs->mtime); }
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/4 f2fs: reject setattr size changes on large folio files
From: Wenjie Qi <[email protected]>
[ Upstream commit 242d30bfc0a84b8b5de0a88821b53c9ad7fd31c4 ]
F2FS large folios are only enabled for immutable non-compressed files. Writable open and writable mmap reject such mappings, but truncate(2) through f2fs_setattr() misses the same guard.
If FS_IMMUTABLE_FL is cleared while the inode is still cached, the mapping can keep large-folio support and ATTR_SIZE can change i_size. Reject size changes in that state.
Stable-dep-of: 2b8704b6a8b2 ("f2fs: fix to reset all pinned status during fggc")
--- fs/f2fs/file.c | 2 ++ 1 file changed, 2 insertions(+)
fs/f2fs/file.c +2 -0
@@ -1136,6 +1136,8 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,return -EPERM ;if ((attr->ia_valid &ATTR_SIZE )) { +if (mapping_large_folio_support (inode->i_mapping)) +return -EOPNOTSUPP ;if (!f2fs_is_compress_backend_ready (inode) ||IS_DEVICE_ALIASING (inode))return -EOPNOTSUPP ;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/4 f2fs: fix to reclaim space in f2fs_allocate_pinning_section()
In reply to Sasha LevinFrom: Chao Yu <[email protected]>
[ Upstream commit fa487f56efba6344aef67d871688f0908fe08af3 ]
It needs to trigger checkpoint to free space reclaimed by f2fs_gc_range(), otherwise, fallocate() on pinfile will fail easily even there is slash space in conventional zone.
[Testcase]nullblk_create.sh 512 2 1024 1024
mkfs.f2fs /dev/nullb0 -f -m
mount /dev/nullb0 /mnt/f2fs/
touch /mnt/f2fs/pinfilef2fs_io pinfile set /mnt/f2fs/pinfile
mkdir /mnt/f2fs/dir/
for((i=0;i<3934;i++)) do { dd if=/dev/zero of=/mnt/f2fs/dir/$i bs=1M count=1;} done sync
for((i=0;i<3934;i+=2)) do { rm /mnt/f2fs/dir/$i;} done for((i=0;i<1950;i++)) do { rm /mnt/f2fs/dir/$i;} done
syncf2fs_io fallocate 0 0 $((1024*1024*1024)) /mnt/f2fs/pinfile
sync
stat /mnt/f2fs/pinfilef2fs_io fiemap 0 $((1024*1024*1024)) /mnt/f2fs/pinfile
[Before]
fallocate failed: Resource temporarily unavailable
File: /mnt/f2fs/pinfile
Size: 109051904 Blocks: 213208 IO Block: 4096 regular file
Device: 250,0 Inode: 4 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-08-12 20:04:02.264000000 +0800
Modify: 2026-08-12 20:04:26.784000000 +0800
Change: 2026-08-12 20:04:26.784000000 +0800
Birth: -
root@localhost:~#
root@localhost:~#
root@localhost:~#
root@localhost:~# f2fs_io fiemap 0 $((1024*1024*1024)) /mnt/f2fs/pinfile
Fiemap: offset = 0 len = 1073741824
logical addr. physical addr. length flags
0 0000000000000000 0000000002e00000 0000000000200000 00001000
1 0000000000200000 000000002dc00000 0000000000400000 00001000
2 0000000000600000 000000002e400000 0000000000600000 00001000
3 0000000000c00000 000000007a400000 0000000005c00000 00001001[After]
File: /mnt/f2fs/pinfile
Size: 1073741824 Blocks: 2099216 IO Block: 4096 regular file
Device: 250,0 Inode: 4 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-08-12 19:47:49.428000000 +0800
Modify: 2026-08-12 19:49:06.808000000 +0800
Change: 2026-08-12 19:49:06.808000000 +0800
Birth: -
Fiemap: offset = 0 len = 1073741824
logical addr. physical addr. length flags
0 0000000000000000 0000000002e00000 0000000000200000 00001000 1 0000000000200000 000000003aa00000 0000000000400000 00001000 2 0000000000600000 000000003b400000 0000000000200000 00001000 3 0000000000800000 000000007a200000 0000000005e00000 00001000 4 0000000006600000 0000000002800000 0000000000200000 00001000 5 0000000006800000 0000000003200000 0000000000400000 00001000 6 0000000006c00000 0000000003000000 0000000000200000 00001000 7 0000000006e00000 0000000003600000 0000000037200000 00001000 8 000000003e000000 000000003b200000 0000000000200000 00001000 9 000000003e200000 000000003a800000 0000000000200000 00001000 10 000000003e400000 000000003ae00000 0000000000400000 00001000 11 000000003e800000 000000003b600000 0000000001800000 00001001
[6.18 backport: Keep the existing non-tracing lock helpers. Release sbi->gc_lock before calling f2fs_sync_fs(), which reacquires it while issuing the checkpoint, and retain the upstream error/retry behavior.
Also carry only the error-exit preparation from 5d49025a4e596 ("f2fs: fix to shrink gc_lock coverage in f2fs_gc_range()"): use the per-iteration err variable and next label without moving locks or changing the f2fs_gc_range() interface. This preserves stable's return values, dry-run stopping behavior and lock coverage while supplying the context required by 2b8704b6a8b2 ("f2fs: fix to reset all pinned status during fggc"). No new functions are introduced.]
Stable-dep-of: 2b8704b6a8b2 ("f2fs: fix to reset all pinned status during fggc")
--- fs/f2fs/gc.c | 12 +++++++++--- fs/f2fs/segment.c | 9 ++++++--- 2 files changed, 15 insertions(+), 6 deletions(-)
fs/f2fs/gc.c +9 -3
@@ -2140,6 +2140,7 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi, .ilist = LIST_HEAD_INIT(gc_list.ilist), .iroot = RADIX_TREE_INIT(gc_list.iroot, GFP_NOFS), }; +int err =0 ;/* * avoid migrating empty section, as it can be allocated by
@@ -2154,14 +2155,19 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi,do_garbage_collect (sbi, segno, &gc_list,FG_GC , true, false);put_gc_inode (&gc_list); -if (!dry_run &&get_valid_blocks (sbi, segno, true)) -return -EAGAIN ; +if (!dry_run &&get_valid_blocks (sbi, segno, true)) { + err = -EAGAIN ; + goto next; + }if (dry_run && dry_run_sections && !get_valid_blocks (sbi, segno, true) && --gc_secs ==0 )break ;if (fatal_signal_pending (current)) -return -ERESTARTSYS ; + err = -ERESTARTSYS ; +next: +if (err) +return err; }return 0 ;
fs/f2fs/segment.c +6 -3
@@ -3364,10 +3364,13 @@ int f2fs_allocate_pinning_section(struct f2fs_sb_info *sbi) err =f2fs_gc_range (sbi,0 , sbi->first_seq_zone_segno -1 , true,ZONED_PIN_SEC_REQUIRED_COUNT );f2fs_up_write (&sbi->gc_lock); - - gc_required = false; -if (!err) +if (err) +return err; + err =f2fs_sync_fs (sbi->sb,1 ); +if (!err) { + gc_required = false; goto retry; + } }return err;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/4 f2fs: fix to reset all pinned status during fggc
In reply to Sasha LevinFrom: Chao Yu <[email protected]>
[ Upstream commit 2b8704b6a8b2896ccad1f5941d9a3e2c5031a470 ]
Otherwise, the pinned status may affect latter flow of fggc.
--- fs/f2fs/gc.c | 3 +++ 1 file changed, 3 insertions(+)
fs/f2fs/gc.c +3 -0
@@ -2155,6 +2155,9 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi,do_garbage_collect (sbi, segno, &gc_list,FG_GC , true, false);put_gc_inode (&gc_list); +/* reset all pinned status during fggc */ +f2fs_unpin_all_sections (sbi, true); +if (!dry_run &&get_valid_blocks (sbi, segno, true)) { err = -EAGAIN ; goto next;
Signature · 1 line
2.53.0