Darrick J. Wong
0520483177
xfs: don't drop errno values when we fail to ficlone the entire range
...
commit 7ce31f20a0771d71779c3b0ec9cdf474cc3c8e9a upstream.
Way back when we first implemented FICLONE for XFS, life was simple --
either the the entire remapping completed, or something happened and we
had to return an errno explaining what happened. Neither of those
ioctls support returning partial results, so it's all or nothing.
Then things got complicated when copy_file_range came along, because it
actually can return the number of bytes copied, so commit 3f68c1f562
tried to make it so that we could return a partial result if the
REMAP_FILE_CAN_SHORTEN flag is set. This is also how FIDEDUPERANGE can
indicate that the kernel performed a partial deduplication.
Unfortunately, the logic is wrong if an error stops the remapping and
CAN_SHORTEN is not set. Because those callers cannot return partial
results, it is an error for ->remap_file_range to return a positive
quantity that is less than the @len passed in. Implementations really
should be returning a negative errno in this case, because that's what
btrfs (which introduced FICLONE{,RANGE}) did.
Therefore, ->remap_range implementations cannot silently drop an errno
that they might have when the number of bytes remapped is less than the
number of bytes requested and CAN_SHORTEN is not set.
Found by running generic/562 on a 64k fsblock filesystem and wondering
why it reported corrupt files.
Cc: <stable@vger.kernel.org> # v4.20
Fixes: 3fc9f5e409 ("xfs: remove xfs_reflink_remap_range")
Really-Fixes: 3f68c1f562 ("xfs: support returning partial reflink results")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-12-19 18:05:03 +01:00
..
libxfs
xfs: fix forkoff miscalculation related to XFS_LITINO(mp)
2023-04-26 11:24:06 +02:00
scrub
xfs: strengthen rmap record flags checking
2020-11-24 13:29:18 +01:00
Kconfig
kmem.c
kmem.h
Makefile
mrlock.h
xfs.h
xfs_acl.c
xfs: remove the kuid/kgid conversion wrappers
2023-04-20 12:07:37 +02:00
xfs_acl.h
xfs_aops.c
xfs: fix missing CoW blocks writeback conversion retry
2023-02-22 12:50:38 +01:00
xfs_aops.h
xfs_attr_inactive.c
xfs: add a function to deal with corrupt buffers post-verifiers
2022-10-29 10:20:33 +02:00
xfs_attr_list.c
xfs: add a function to deal with corrupt buffers post-verifiers
2022-10-29 10:20:33 +02:00
xfs_bio_io.c
xfs_bmap_item.c
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_bmap_item.h
xfs: proper replay of deferred ops queued during log recovery
2023-02-22 12:50:36 +01:00
xfs_bmap_util.c
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
xfs_bmap_util.h
xfs_buf.c
xfs: xfs_buf_corruption_error should take __this_address
2022-10-29 10:20:33 +02:00
xfs_buf.h
xfs: add a function to deal with corrupt buffers post-verifiers
2022-10-29 10:20:33 +02:00
xfs_buf_item.c
xfs: add a new xfs_sb_version_has_v3inode helper
2023-04-20 12:07:37 +02:00
xfs_buf_item.h
xfs_dir2_readdir.c
xfs_discard.c
xfs_discard.h
xfs_dquot.c
xfs: remove the kuid/kgid conversion wrappers
2023-04-20 12:07:37 +02:00
xfs_dquot.h
xfs: remove the xfs_dq_logitem_t typedef
2022-10-29 10:20:33 +02:00
xfs_dquot_item.c
xfs: trylock underlying buffer on dquot flush
2022-10-29 10:20:34 +02:00
xfs_dquot_item.h
xfs: factor out quotaoff intent AIL removal and memory free
2022-10-29 10:20:33 +02:00
xfs_error.c
xfs: report corruption only as a regular error
2023-04-20 12:07:38 +02:00
xfs_error.h
xfs: xfs_buf_corruption_error should take __this_address
2022-10-29 10:20:33 +02:00
xfs_export.c
xfs: factor out a new xfs_log_force_inode helper
2022-10-29 10:20:34 +02:00
xfs_export.h
xfs_extent_busy.c
xfs: don't reuse busy extents on extent trim
2023-04-20 12:07:38 +02:00
xfs_extent_busy.h
xfs_extfree_item.c
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_extfree_item.h
xfs: proper replay of deferred ops queued during log recovery
2023-02-22 12:50:36 +01:00
xfs_file.c
xfs: don't drop errno values when we fail to ficlone the entire range
2024-12-19 18:05:03 +01:00
xfs_filestream.c
xfs_filestream.h
xfs_fsmap.c
xfs: add missing assert in xfs_fsmap_owner_from_rmap
2022-09-28 11:04:09 +02:00
xfs_fsmap.h
xfs: fix deadlock and streamline xfs_getfsmap performance
2020-10-29 09:57:48 +01:00
xfs_fsops.c
xfs_fsops.h
xfs_globals.c
xfs_health.c
xfs_icache.c
xfs: ensure that the inode uid/gid match values match the icdinode ones
2023-04-20 12:07:37 +02:00
xfs_icache.h
xfs_icreate_item.c
xfs: expose the log push threshold
2023-02-22 12:50:37 +01:00
xfs_icreate_item.h
xfs_inode.c
xfs: fix up non-directory creation in SGID directories
2023-04-20 12:07:37 +02:00
xfs_inode.h
xfs: merge the projid fields in struct xfs_icdinode
2023-04-20 12:07:37 +02:00
xfs_inode_item.c
xfs: remove the di_version field from struct icdinode
2023-04-20 12:07:37 +02:00
xfs_inode_item.h
xfs: remove the xfs_inode_log_item_t typedef
2023-02-22 12:50:35 +01:00
xfs_ioctl.c
xfs: remove the di_version field from struct icdinode
2023-04-20 12:07:37 +02:00
xfs_ioctl.h
xfs_ioctl32.c
xfs_ioctl32.h
xfs_iomap.c
xfs: don't fail unwritten extent conversion on writeback due to edquot
2022-11-10 17:57:54 +01:00
xfs_iomap.h
xfs_iops.c
xfs: remove the di_version field from struct icdinode
2023-04-20 12:07:37 +02:00
xfs_iops.h
xfs_itable.c
xfs: remove the di_version field from struct icdinode
2023-04-20 12:07:37 +02:00
xfs_itable.h
xfs_iwalk.c
xfs: fix the forward progress assertion in xfs_iwalk_run_callbacks
2023-02-22 12:50:38 +01:00
xfs_iwalk.h
xfs_linux.h
xfs: report corruption only as a regular error
2023-04-20 12:07:38 +02:00
xfs_log.c
xfs: sync lazy sb accounting on quiesce of read-only mounts
2023-02-22 12:50:38 +01:00
xfs_log.h
xfs: sync lazy sb accounting on quiesce of read-only mounts
2023-02-22 12:50:38 +01:00
xfs_log_cil.c
xfs: prevent UAF in xfs_log_item_in_current_chkpt
2023-02-22 12:50:38 +01:00
xfs_log_priv.h
xfs: fix use-after-free on CIL context on shutdown
2022-10-29 10:20:34 +02:00
xfs_log_recover.c
xfs: verify buffer contents when we skip log replay
2023-06-28 10:18:42 +02:00
xfs_message.c
xfs: constify the buffer pointer arguments to error functions
2022-09-28 11:04:10 +02:00
xfs_message.h
xfs: constify the buffer pointer arguments to error functions
2022-09-28 11:04:10 +02:00
xfs_mount.c
xfs: force log and push AIL to clear pinned inodes when aborting mount
2023-04-20 12:07:38 +02:00
xfs_mount.h
xfs: move inode flush to the sync workqueue
2022-10-29 10:20:34 +02:00
xfs_mru_cache.c
xfs_mru_cache.h
xfs_ondisk.h
xfs_pnfs.c
xfs: slightly tweak an assert in xfs_fs_map_blocks
2022-09-28 11:04:09 +02:00
xfs_pnfs.h
xfs_pwork.c
xfs_pwork.h
xfs_qm.c
xfs: remove the kuid/kgid conversion wrappers
2023-04-20 12:07:37 +02:00
xfs_qm.h
xfs_qm_bhv.c
xfs: merge the projid fields in struct xfs_icdinode
2023-04-20 12:07:37 +02:00
xfs_qm_syscalls.c
xfs: fix unmount hang and memory leak on shutdown during quotaoff
2022-10-29 10:20:33 +02:00
xfs_quota.h
xfs: remove the icdinode di_uid/di_gid members
2023-04-20 12:07:37 +02:00
xfs_quotaops.c
xfs_refcount_item.c
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_refcount_item.h
xfs: proper replay of deferred ops queued during log recovery
2023-02-22 12:50:36 +01:00
xfs_reflink.c
xfs: redesign the reflink remap loop to fix blkres depletion crash
2022-11-25 17:42:03 +01:00
xfs_reflink.h
xfs_rmap_item.c
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_rmap_item.h
xfs: proper replay of deferred ops queued during log recovery
2023-02-22 12:50:36 +01:00
xfs_rtalloc.c
xfs: fix realtime bitmap/summary file truncation when growing rt volume
2020-11-05 11:43:14 +01:00
xfs_rtalloc.h
xfs_stats.c
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_stats.h
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_super.c
xfs: show the proper user quota options
2023-04-20 12:07:37 +02:00
xfs_super.h
xfs_symlink.c
xfs: set inode size after creating symlink
2023-04-20 12:07:38 +02:00
xfs_symlink.h
xfs_sysctl.c
xfs_sysctl.h
xfs_sysfs.c
xfs_sysfs.h
xfs_trace.c
xfs_trace.h
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_trans.c
xfs: preserve rmapbt swapext block reservation from freed blocks
2022-11-25 17:42:03 +01:00
xfs_trans.h
xfs: periodically relog deferred intent items
2023-02-22 12:50:37 +01:00
xfs_trans_ail.c
xfs: drain the buf delwri queue before xfsaild idles
2022-11-25 17:42:03 +01:00
xfs_trans_buf.c
xfs_trans_dquot.c
xfs: shut down the filesystem if we screw up quota reservation
2023-04-20 12:07:38 +02:00
xfs_trans_priv.h
xfs: tail updates only need to occur when LSN changes
2022-10-29 10:20:34 +02:00
xfs_xattr.c