mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-23 19:04:45 +03:00
e7524594a9
When copy_file_range overwrites a recent truncation, subsequent reads can incorrectly determine that it is read hole instead of reading the cloned blocks. This can happen when the following conditions are met: - Truncate adds blkid to dn_free_ranges - A new TXG is created - copy_file_range calls dmu_brt_clone which override the block pointer and set DB_NOFILL - Subsequent read, given DB_NOFILL, hits dbuf_read_impl and dbuf_read_hole - dbuf_read_hole calls dnode_block_freed, which returns TRUE because the truncated blkids are still in dn_free_ranges This will not happen if the clone and truncate are in the same TXG, because the block clone would update the current TXG's dn_free_ranges, which is why this bug only triggers under high IO load (such as compilation). Fix this by skipping the dnode_block_freed call if the block is overridden. The fix shouldn't cause an issue when the cloned block is subsequently freed in later TXGs, as dbuf_undirty would remove the override. This requires a dedicated test program as it is much harder to trigger with scripts (this needs to generate a lot of I/O in short period of time for the bug to trigger reliably). Assisted-by: Gemini:gemini-3.1-pro Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Gary Guo <gary@kernel.org> Closes #18412 Closes #18421
63 lines
831 B
Plaintext
63 lines
831 B
Plaintext
/badsend
|
|
/btree_test
|
|
/chg_usr_exec
|
|
/clonefile
|
|
/clone_after_trunc
|
|
/clone_mmap_cached
|
|
/clone_mmap_write
|
|
/crypto_test
|
|
/devname2devid
|
|
/dir_rd_update
|
|
/draid
|
|
/file_fadvise
|
|
/file_append
|
|
/file_check
|
|
/file_trunc
|
|
/file_write
|
|
/get_diff
|
|
/getversion
|
|
/largest_file
|
|
/libzfs_input_check
|
|
/manipulate_user_buffer
|
|
/mkbusy
|
|
/mkfile
|
|
/mkfiles
|
|
/mktree
|
|
/mmap_exec
|
|
/mmap_ftruncate
|
|
/mmap_libaio
|
|
/mmap_seek
|
|
/mmap_sync
|
|
/mmapwrite
|
|
/mmap_write_sync
|
|
/nvlist_to_lua
|
|
/randfree_file
|
|
/randwritecomp
|
|
/read_dos_attributes
|
|
/readmmap
|
|
/renameat2
|
|
/rename_dir
|
|
/rm_lnkcnt_zero_file
|
|
/send_doall
|
|
/statx
|
|
/stride_dd
|
|
/threadsappend
|
|
/user_ns_exec
|
|
/write_dos_attributes
|
|
/xattrtest
|
|
/zed_fd_spill-zedlet
|
|
/suid_write_to_file
|
|
/cp_files
|
|
/ctime
|
|
/truncate_test
|
|
/ereports
|
|
/zfs_diff-socket
|
|
/dosmode_readonly_write
|
|
/blake3_test
|
|
/edonr_test
|
|
/skein_test
|
|
/sha2_test
|
|
/idmap_util
|
|
/statx
|
|
/setlease
|