diff options
| author | Josef Bacik <josef@toxicpanda.com> | 2026-10-04 20:33:45 +0000 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-10-29 10:38:13 +0100 |
| commit | aa6439028dc39230e62917ba0a7dafdc103564cf (patch) | |
| tree | e031cef06742c80485f21a7ee77339b91f598150 /tools/lib/python/kdoc | |
| parent | b14fcabd34e02c40f72d3cd1e9bd4fd18df40ff1 (diff) | |
writeback: don't kick a missing wb for dontcache writes
With CONFIG_CGROUP_WRITEBACK, inode->i_wb stays NULL until the inode is
dirtied for the first time (folio_account_dirtied(), __mark_inode_dirty()
or wbc_attach_fdatawrite_inode() attach it). generic_write_sync() calls
filemap_dontcache_kick_writeback() for every IOCB_DONTCACHE write,
including O_DIRECT ones, which never dirty the page cache. The function
then passes the NULL returned by unlocked_inode_to_wb_begin() to
wb_has_dirty_io():
fd = open("/dev/ram0", O_WRONLY | O_DIRECT);
pwritev2(fd, &iov, 1, 0, RWF_DONTCACHE);
BUG: KASAN: null-ptr-deref in filemap_dontcache_kick_writeback+0xec
Oops: general protection fault, probably for non-canonical address
RIP: 0010:filemap_dontcache_kick_writeback+0xfd/0x7a0
The task dies inside rcu_read_lock(). blkdev_write_iter() gets there for
any block device whose page cache has not been dirtied yet.
nfs_file_direct_write() calls generic_write_sync() the same way.
An inode without a wb has never had dirty pages, so there is nothing to
flush: skip the kick.
Fixes: e1bf79628453 ("mm: kick writeback flusher for IOCB_DONTCACHE with targeted dirty tracking")
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'tools/lib/python/kdoc')
0 files changed, 0 insertions, 0 deletions
