Skip to contentSkip to conversation

WARNING in f2fs_unlink

syzbot Superseded syzbot 3 participants 7 messages Nov 22, 2024 – Feb 11, 2025 F2FS file system

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore

syzbot

author syzbot
#0 lore raw

Hello,

syzbot found the following issue on:

HEAD commit:    43fb83c17ba2 Merge tag 'soc-arm-6.13' of git://git.kernel...
git tree:       upstream
console+strace: https://syzkaller.appspot.com/x/log.txt?x=170f5930580000
kernel config:  https://syzkaller.appspot.com/x/.config?x=e796b1bf154f93a7
dashboard link: https://syzkaller.appspot.com/bug?extid=b01a36acd7007e273a83
compiler:       Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1213fae8580000
C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=12b3a75f980000

Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/c93bb9014475/disk-43fb83c1.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/8116200f91e3/vmlinux-43fb83c1.xz
kernel image: https://storage.googleapis.com/syzbot-assets/d3a982ec74b0/bzImage-43fb83c1.xz
mounted in repro: https://storage.googleapis.com/syzbot-assets/43c22dda0085/mount_0.gz

The issue was bisected to:

commit 4c8ff7095bef64fc47e996a938f7d57f9e077da3

Author: Chao Yu <[email protected]>
Date:   Fri Nov 1 10:07:14 2019 +0000

f2fs: support data compression

bisection log:  https://syzkaller.appspot.com/x/bisect.txt?x=101e5b78580000
final oops:     https://syzkaller.appspot.com/x/report.txt?x=121e5b78580000
console output: https://syzkaller.appspot.com/x/log.txt?x=141e5b78580000

IMPORTANT: if you fix the issue, please add the following tag to the commit:

Reported-by [email protected]
Fixes 4c8ff7095bef ("f2fs: support data compression")

F2FS-fs (loop0): Found nat_bits in checkpoint F2FS-fs (loop0): Mounted with checkpoint version = 48b305e4

------------[ cut here ]------------
WARNING: CPU: 0 PID: 5835 at fs/inode.c:407 drop_nlink+0xc4/0x110 fs/inode.c:407
Modules linked in:
CPU: 0 UID: 0 PID: 5835 Comm: syz-executor152 Not tainted 6.12.0-syzkaller-03657-g43fb83c17ba2 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/30/2024
RIP: 0010:drop_nlink+0xc4/0x110 fs/inode.c:407
Code: bb 70 07 00 00 be 08 00 00 00 e8 07 df e5 ff f0 48 ff 83 70 07 00 00 5b 41 5c 41 5e 41 5f 5d c3 cc cc cc cc e8 ed e9 7e ff 90 <0f> 0b 90 eb 83 44 89 e1 80 e1 07 80 c1 03 38 c1 0f 8c 5c ff ff ff
RSP: 0018:ffffc90003cafb98 EFLAGS: 00010293
RAX: ffffffff82160e93 RBX: 1ffff1100e63e009 RCX: ffff888035573c00
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
RBP: 0000000000000000 R08: ffffffff82160e13 R09: 1ffffffff203969e
R10: dffffc0000000000 R11: fffffbfff203969f R12: ffff8880731f0048
R13: dffffc0000000000 R14: ffff8880731f0000 R15: dffffc0000000000
FS:  0000555576140380(0000) GS:ffff8880b8600000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000000000066c7e0 CR3: 00000000758b4000 CR4: 00000000003526f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
 <TASK>
 f2fs_i_links_write fs/f2fs/f2fs.h:3127 [inline]
 f2fs_drop_nlink+0xd6/0x380 fs/f2fs/dir.c:822
 f2fs_unlink+0x47f/0x960 fs/f2fs/namei.c:572
 vfs_unlink+0x365/0x650 fs/namei.c:4523
 do_unlinkat+0x4ae/0x830 fs/namei.c:4587
 __do_sys_unlinkat fs/namei.c:4630 [inline]
 __se_sys_unlinkat fs/namei.c:4623 [inline]
 __x64_sys_unlinkat+0xcc/0xf0 fs/namei.c:4623
 do_syscall_x64 arch/x86/entry/common.c:52 [inline]
 do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7f71e4b355f9
Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 61 17 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffed28a90b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000107
RAX: ffffffffffffffda RBX: 00007ffed28a9298 RCX: 00007f71e4b355f9
RDX: 0000000000000000 RSI: 0000000020000380 RDI: 00000000ffffff9c
RBP: 00007f71e4bb8610 R08: 00000000000105b7 R09: 0000000000000000
R10: 00007ffed28a8f80 R11: 0000000000000246 R12: 0000000000000001
R13: 00007ffed28a9288 R14: 0000000000000001 R15: 0000000000000001
 </TASK>

---
This report is generated by a bot. It may contain errors. See https://goo.gl/tpsmEJ for more information about syzbot. syzbot engineers can be reached at [email protected].

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot. For information about bisection process see: https://goo.gl/tpsmEJ#bisection

If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title

If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.

If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)

If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report

If you want to undo deduplication, reply with:
#syz undup

#1 lore raw

PATCH 1/1 f2fs: Add check for deleted inode

The syzbot reproducer mounts a f2fs image, then tries to unlink an existing file. However, the unlinked file already has a link count of 0 when it is read for the first time in do_read_inode().

Add a check to sanity_check_inode() for i_nlink == 0.

#syz test

Reported-by [email protected]
Fixes 4c8ff7095bef ("f2fs: support data compression")
---
 fs/f2fs/inode.c | 6 ++++++
 1 file changed, 6 insertions(+)
fs/f2fs/inode.c +6 -0
index 1ed86df343a5..65f1dc32f173 100644
@@ -372,6 +372,12 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)
 		return false;
 	}
 
+	if (inode->i_nlink == 0) {
+		f2fs_warn(sbi, "%s: inode (ino=%lx) has a link count of 0",
+			  __func__, inode->i_ino);
+		return false;
+	}
+
 	return true;
 }
 
Signature · 1 line
2.43.0
author syzbot Tested-by on v1 1/1
#2 lore raw
syzbot has tested the proposed patch and the reproducer did not trigger any issue:

Hello,

syzbot has tested the proposed patch and the reproducer did not trigger any issue:

Tested on:

commit:         9f16d5e6 Merge tag 'for-linus' of git://git.kernel.org..
git tree:       upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=14d40778580000
kernel config:  https://syzkaller.appspot.com/x/.config?x=e92fc420ca55fe33
dashboard link: https://syzkaller.appspot.com/bug?extid=b01a36acd7007e273a83
compiler:       Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
patch:          https://syzkaller.appspot.com/x/patch.diff?x=15dd69c0580000

Note: testing is done by a robot and is best-effort only.

maintainer
#3 lore raw

Re: [PATCH] f2fs: Add check for deleted inode

In reply to Leo Stone
Quoted 11 lines · Leo Stone

The syzbot reproducer mounts a f2fs image, then tries to unlink an existing file. However, the unlinked file already has a link count of 0 when it is read for the first time in do_read_inode().

Add a check to sanity_check_inode() for i_nlink == 0.

#syz test

Reported-by [email protected]
Fixes 4c8ff7095bef ("f2fs: support data compression")

Hello Leo,

I'm fine w/ this change, but I didn't get it, how did above commit introduce this bug?

Thanks,

Quoted 22 lines
---
  fs/f2fs/inode.c | 6 ++++++
  1 file changed, 6 insertions(+)
fs/f2fs/inode.c +6 -0
index 1ed86df343a5..65f1dc32f173 100644
@@ -372,6 +372,12 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)
  		return false;
  	}
 
+	if (inode->i_nlink == 0) {
+		f2fs_warn(sbi, "%s: inode (ino=%lx) has a link count of 0",
+			  __func__, inode->i_ino);
+		return false;
+	}
+
  	return true;
  }
 
#4 lore raw

Re: [PATCH] f2fs: Add check for deleted inode

Quoted 3 lines · Chao Yu

I'm fine w/ this change, but I didn't get it, how did above commit introduce this bug?

Hello Chao,

The commit from the bisect didn't exactly introduce this bug, since it would still be possible to make a different image that does the exact same thing in the older code.

This commit was blamed in the bisect because it changes the layout of struct f2fs_inode:

Review struct f2fs_inode { · line 281

Quoted 11 lines
(quoted diff) +4 -0
@@ -271,6 +272,10 @@ struct f2fs_inode {
 			__le32 i_inode_checksum;/* inode meta checksum */
 			__le64 i_crtime;	/* creation time */
 			__le32 i_crtime_nsec;	/* creation time in nano scale */
+			__le64 i_compr_blocks;	/* # of compressed blocks */
+			__u8 i_compress_algorithm;	/* compress algorithm */
+			__u8 i_log_cluster_size;	/* log of cluster size */
+			__le16 i_padding;		/* padding */
 			__le32 i_extra_end[0];	/* for attribute size calculation */
 		} __packed;
 		__le32 i_addr[DEF_ADDRS_PER_INODE];	/* Pointers to data blocks */

This changes F2FS_TOTAL_EXTRA_ATTR_SIZE, which allows the syzbot reproducer's inode to pass the sanity check for corrupted i_extra_size. Before this change, the inode gets rejected as corrupt:

Quoted 1 line
[   62.794566][ T9662] F2FS-fs (loop0): sanity_check_inode: inode (ino=7) has corrupted i_extra_isize: 36, max: 24

Thanks,
Leo

maintainer
#5 lore raw

Re: [PATCH] f2fs: Add check for deleted inode

Quoted 14 lines · Leo Stone
Quoted 3 lines · Chao Yu

I'm fine w/ this change, but I didn't get it, how did above commit introduce this bug?

Hello Chao,

The commit from the bisect didn't exactly introduce this bug, since it would still be possible to make a different image that does the exact same thing in the older code.

This commit was blamed in the bisect because it changes the layout of struct f2fs_inode:

Quoted 17 lines

Review struct f2fs_inode { · line 281

Quoted 11 lines
(quoted diff) +4 -0
@@ -271,6 +272,10 @@ struct f2fs_inode {
 			__le32 i_inode_checksum;/* inode meta checksum */
 			__le64 i_crtime;	/* creation time */
 			__le32 i_crtime_nsec;	/* creation time in nano scale */
+			__le64 i_compr_blocks;	/* # of compressed blocks */
+			__u8 i_compress_algorithm;	/* compress algorithm */
+			__u8 i_log_cluster_size;	/* log of cluster size */
+			__le16 i_padding;		/* padding */
 			__le32 i_extra_end[0];	/* for attribute size calculation */
 		} __packed;
 		__le32 i_addr[DEF_ADDRS_PER_INODE];	/* Pointers to data blocks */

This changes F2FS_TOTAL_EXTRA_ATTR_SIZE, which allows the syzbot reproducer's inode to pass the sanity check for corrupted i_extra_size. Before this change, the inode gets rejected as corrupt:

Quoted 1 line
[   62.794566][ T9662] F2FS-fs (loop0): sanity_check_inode: inode (ino=7) has corrupted i_extra_isize: 36, max: 24

Leo,

Ah, right, thanks for the explanation, anyway, can you please correct this "Fixes line"?

Thanks,

Quoted 3 lines

Thanks,
Leo

maintainer
#6 lore raw
In reply to syzbot

#syz fix: f2fs: add check for deleted inode

Quoted 104 lines · syzbot

Hello,

syzbot found the following issue on:

HEAD commit:    43fb83c17ba2 Merge tag 'soc-arm-6.13' of git://git.kernel...
git tree:       upstream
console+strace: https://syzkaller.appspot.com/x/log.txt?x=170f5930580000
kernel config:  https://syzkaller.appspot.com/x/.config?x=e796b1bf154f93a7
dashboard link: https://syzkaller.appspot.com/bug?extid=b01a36acd7007e273a83
compiler:       Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
syz repro:      https://syzkaller.appspot.com/x/repro.syz?x=1213fae8580000
C reproducer:   https://syzkaller.appspot.com/x/repro.c?x=12b3a75f980000

Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/c93bb9014475/disk-43fb83c1.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/8116200f91e3/vmlinux-43fb83c1.xz
kernel image: https://storage.googleapis.com/syzbot-assets/d3a982ec74b0/bzImage-43fb83c1.xz
mounted in repro: https://storage.googleapis.com/syzbot-assets/43c22dda0085/mount_0.gz

The issue was bisected to:

commit 4c8ff7095bef64fc47e996a938f7d57f9e077da3

Author: Chao Yu <[email protected]>
Date:   Fri Nov 1 10:07:14 2019 +0000

f2fs: support data compression

bisection log:  https://syzkaller.appspot.com/x/bisect.txt?x=101e5b78580000
final oops:     https://syzkaller.appspot.com/x/report.txt?x=121e5b78580000
console output: https://syzkaller.appspot.com/x/log.txt?x=141e5b78580000

IMPORTANT: if you fix the issue, please add the following tag to the commit:

Reported-by [email protected]
Fixes 4c8ff7095bef ("f2fs: support data compression")

F2FS-fs (loop0): Found nat_bits in checkpoint F2FS-fs (loop0): Mounted with checkpoint version = 48b305e4

------------[ cut here ]------------
WARNING: CPU: 0 PID: 5835 at fs/inode.c:407 drop_nlink+0xc4/0x110 fs/inode.c:407
Modules linked in:
CPU: 0 UID: 0 PID: 5835 Comm: syz-executor152 Not tainted 6.12.0-syzkaller-03657-g43fb83c17ba2 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/30/2024
RIP: 0010:drop_nlink+0xc4/0x110 fs/inode.c:407
Code: bb 70 07 00 00 be 08 00 00 00 e8 07 df e5 ff f0 48 ff 83 70 07 00 00 5b 41 5c 41 5e 41 5f 5d c3 cc cc cc cc e8 ed e9 7e ff 90 <0f> 0b 90 eb 83 44 89 e1 80 e1 07 80 c1 03 38 c1 0f 8c 5c ff ff ff
RSP: 0018:ffffc90003cafb98 EFLAGS: 00010293
RAX: ffffffff82160e93 RBX: 1ffff1100e63e009 RCX: ffff888035573c00
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
RBP: 0000000000000000 R08: ffffffff82160e13 R09: 1ffffffff203969e
R10: dffffc0000000000 R11: fffffbfff203969f R12: ffff8880731f0048
R13: dffffc0000000000 R14: ffff8880731f0000 R15: dffffc0000000000
FS:  0000555576140380(0000) GS:ffff8880b8600000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000000000066c7e0 CR3: 00000000758b4000 CR4: 00000000003526f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
 <TASK>
 f2fs_i_links_write fs/f2fs/f2fs.h:3127 [inline]
 f2fs_drop_nlink+0xd6/0x380 fs/f2fs/dir.c:822
 f2fs_unlink+0x47f/0x960 fs/f2fs/namei.c:572
 vfs_unlink+0x365/0x650 fs/namei.c:4523
 do_unlinkat+0x4ae/0x830 fs/namei.c:4587
 __do_sys_unlinkat fs/namei.c:4630 [inline]
 __se_sys_unlinkat fs/namei.c:4623 [inline]
 __x64_sys_unlinkat+0xcc/0xf0 fs/namei.c:4623
 do_syscall_x64 arch/x86/entry/common.c:52 [inline]
 do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
 entry_SYSCALL_64_after_hwframe+0x77/0x7f
RIP: 0033:0x7f71e4b355f9
Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 61 17 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffed28a90b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000107
RAX: ffffffffffffffda RBX: 00007ffed28a9298 RCX: 00007f71e4b355f9
RDX: 0000000000000000 RSI: 0000000020000380 RDI: 00000000ffffff9c
RBP: 00007f71e4bb8610 R08: 00000000000105b7 R09: 0000000000000000
R10: 00007ffed28a8f80 R11: 0000000000000246 R12: 0000000000000001
R13: 00007ffed28a9288 R14: 0000000000000001 R15: 0000000000000001
 </TASK>

---
This report is generated by a bot. It may contain errors. See https://goo.gl/tpsmEJ for more information about syzbot. syzbot engineers can be reached at [email protected].

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot. For information about bisection process see: https://goo.gl/tpsmEJ#bisection

If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title

If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.

If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)

If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report

If you want to undo deduplication, reply with:
#syz undup