deepin-kernel/fs/ext4
Brian Foster ec3c16cd9a ext4: only dirty folios when data journaling regular files
commit e26268ff1dcae5662c1b96c35f18cfa6ab73d9de upstream.

fstest generic/388 occasionally reproduces a crash that looks as
follows:

BUG: kernel NULL pointer dereference, address: 0000000000000000
...
Call Trace:
 <TASK>
 ext4_block_zero_page_range+0x30c/0x380 [ext4]
 ext4_truncate+0x436/0x440 [ext4]
 ext4_process_orphan+0x5d/0x110 [ext4]
 ext4_orphan_cleanup+0x124/0x4f0 [ext4]
 ext4_fill_super+0x262d/0x3110 [ext4]
 get_tree_bdev_flags+0x132/0x1d0
 vfs_get_tree+0x26/0xd0
 vfs_cmd_create+0x59/0xe0
 __do_sys_fsconfig+0x4ed/0x6b0
 do_syscall_64+0x82/0x170
 ...

This occurs when processing a symlink inode from the orphan list. The
partial block zeroing code in the truncate path calls
ext4_dirty_journalled_data() -> folio_mark_dirty(). The latter calls
mapping->a_ops->dirty_folio(), but symlink inodes are not assigned an
a_ops vector in ext4, hence the crash.

To avoid this problem, update the ext4_dirty_journalled_data() helper to
only mark the folio dirty on regular files (for which a_ops is
assigned). This also matches the journaling logic in the ext4_symlink()
creation path, where ext4_handle_dirty_metadata() is called directly.

Fixes: d84c9ebdac ("ext4: Mark pages with journalled data dirty")
Signed-off-by: Brian Foster <bfoster@redhat.com>
Link: https://patch.msgid.link/20250516173800.175577-1-bfoster@redhat.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: stable@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit cf6a4c4ac7b6e3214f25df594c9689a62f1bb456)
2025-07-03 11:31:54 +08:00
..
.kunitconfig
Kconfig fs: add CONFIG_BUFFER_HEAD 2023-08-02 09:13:09 -06:00
Makefile
acl.c ext4: convert to ctime accessor functions 2023-07-24 10:29:54 +02:00
acl.h ext4: apply umask if ACL support is disabled 2023-11-28 17:20:15 +00:00
balloc.c ext4: reorder capability check last 2025-06-10 10:34:53 +08:00
bitmap.c ext4: remove useless conditional branch code 2023-04-19 23:39:08 -04:00
block_validity.c ext4: make block validity check resistent to sb bh corruption 2025-05-09 23:02:58 +08:00
crypto.c ext4: fix memory leaks in ext4_fname_{setup_filename,prepare_lookup} 2023-08-05 08:17:56 -04:00
dir.c ext4: fix OOB read when checking dotdot dir 2025-04-14 15:51:33 +08:00
ext4.h ext4: factor out ext4_get_maxbytes() 2025-07-03 11:31:54 +08:00
ext4_extents.h
ext4_jbd2.c Many ext4 and jbd2 cleanups and bug fixes for v6.6-rc1. 2023-08-31 15:18:15 -07:00
ext4_jbd2.h ext4: split ext4_journal_start trace for debug 2022-12-01 10:46:54 -05:00
extents.c ext4: factor out ext4_get_maxbytes() 2025-07-03 11:31:54 +08:00
extents_status.c ext4: fix infinite loop when replaying fast_commit 2024-12-10 20:39:49 +08:00
extents_status.h ext4: make ext4_es_insert_extent() return void 2023-06-26 19:35:12 -04:00
fast_commit.c ext4: use handle to mark fc as ineligible in __track_dentry_update() 2024-12-10 20:42:30 +08:00
fast_commit.h ext4: add missing validation of fast-commit record lengths 2022-12-08 21:49:24 -05:00
file.c ext4: factor out ext4_get_maxbytes() 2025-07-03 11:31:54 +08:00
fsmap.c ext4: fix FS_IOC_GETFSMAP handling 2024-12-10 20:45:03 +08:00
fsmap.h
fsync.c ext4: drop EXT4_MF_FS_ABORTED flag 2023-07-29 18:37:53 -04:00
hash.c ext4: remove redundant checks of s_encoding 2023-08-27 11:27:13 -04:00
ialloc.c ext4: convert to new timestamp accessors 2025-01-13 11:06:44 +08:00
indirect.c ext4: fix race in buffer_head read fault injection 2024-12-10 20:44:25 +08:00
inline.c ext4: inline: fix len overflow in ext4_prepare_inline_data 2025-07-03 11:31:54 +08:00
inode-test.c ext4: convert to ctime accessor functions 2023-07-24 10:29:54 +02:00
inode.c ext4: only dirty folios when data journaling regular files 2025-07-03 11:31:54 +08:00
ioctl.c ext4: convert to new timestamp accessors 2025-01-13 11:06:44 +08:00
mballoc.c ext4: fix FS_IOC_GETFSMAP handling 2024-12-10 20:45:03 +08:00
mballoc.h ext4: fix FS_IOC_GETFSMAP handling 2024-12-10 20:45:03 +08:00
migrate.c ext4: fix i_data_sem unlock order in ext4_ind_migrate() 2024-12-10 20:42:26 +08:00
mmp.c ext4: fix race in buffer_head read fault injection 2024-12-10 20:44:25 +08:00
move_extent.c ext4: fix race in buffer_head read fault injection 2024-12-10 20:44:25 +08:00
namei.c ext4: fix off-by-one error in do_split 2025-05-09 18:47:24 +08:00
orphan.c ext4: remove trailing newline from ext4_msg() message 2022-12-08 21:49:23 -05:00
page-io.c ext4: do not convert the unwritten extents if data writeback fails 2025-06-10 10:34:55 +08:00
readpage.c ext4: remove calls to to set/clear the folio error flag 2024-12-10 20:44:25 +08:00
resize.c ext4: fix race in buffer_head read fault injection 2024-12-10 20:44:25 +08:00
super.c ext4: reject the 'data_err=abort' option in nojournal mode 2025-06-10 10:34:55 +08:00
symlink.c fs: port ->getattr() to pass mnt_idmap 2023-01-19 09:24:25 +01:00
sysfs.c ext4: avoid ptr null pointer dereference 2024-12-10 20:39:25 +08:00
truncate.h
verity.c - Nick Piggin's "shoot lazy tlbs" series, to improve the peformance of 2023-04-27 19:42:02 -07:00
xattr.c ext4: ignore xattrs past end 2025-05-09 18:47:19 +08:00
xattr.h
xattr_hurd.c fs: port xattr to mnt_idmap 2023-01-19 09:24:28 +01:00
xattr_security.c fs: port xattr to mnt_idmap 2023-01-19 09:24:28 +01:00
xattr_trusted.c fs: port xattr to mnt_idmap 2023-01-19 09:24:28 +01:00
xattr_user.c fs: port xattr to mnt_idmap 2023-01-19 09:24:28 +01:00