mirror_zfs/module/os/freebsd/zfs
Tony Hutter 00d85a98ea BRT: Fix FICLONE/FICLONERANGE shortened copy
On Linux the ioctl_ficlonerange() and ioctl_ficlone() system calls
are expected to either fully clone the specified range or return an
error.  The range may be for an entire file.  While internally ZFS
supports cloning partial ranges there's no way to return the length
cloned to the caller so we need to make this all or nothing.

As part of this change support for the REMAP_FILE_CAN_SHORTEN flag
has been added.  When REMAP_FILE_CAN_SHORTEN is set zfs_clone_range()
will return a shortened range when encountering pending dirty records.
When it's clear zfs_clone_range() will block and wait for the records
to be written out allowing the blocks to be cloned.

Furthermore, the file range lock is held over the region being cloned
to prevent it from being modified while cloning.  This doesn't quite
provide an atomic semantics since if an error is encountered only a
portion of the range may be cloned.  This will be converted to an
error if REMAP_FILE_CAN_SHORTEN was not provided and returned to the
caller.  However, the destination file range is left in an undefined
state.

A test case has been added which exercises this functionality by
verifying that `cp --reflink=never|auto|always` works correctly.

Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #15728
Closes #15842
2024-02-06 10:01:15 -08:00
..
abd_os.c FreeBSD: use zero_region instead of allocating a dedicated page 2022-05-04 11:46:37 -07:00
arc_os.c Unify arc_prune_async() code 2023-11-08 12:15:41 -08:00
crypto_os.c FreeBSD: Improve crypto_dispatch() handling 2022-06-17 15:38:51 -07:00
dmu_os.c Remove bcopy(), bzero(), bcmp() 2022-03-15 15:13:42 -07:00
event_os.c FreeBSD: Fix the build on FreeBSD 12 2023-11-28 15:19:07 -08:00
hkdf.c Remove bcopy(), bzero(), bcmp() 2022-03-15 15:13:42 -07:00
kmod_core.c FreeBSD: Reduce divergence from in-tree sources 2023-10-10 19:19:09 -07:00
spa_os.c Fix build on FreeBSD 2023-03-22 09:24:41 -07:00
sysctl_os.c Reduce number of metaslab preload taskq threads. 2023-10-07 09:08:20 -07:00
vdev_file.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
vdev_geom.c Fix build on FreeBSD 2023-03-22 09:24:41 -07:00
vdev_label_os.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zfs_acl.c Use list_remove_head() where possible. 2023-06-09 10:12:52 -07:00
zfs_ctldir.c FreeBSD: Fix ZFS so that snapshots under .zfs/snapshot are NFS visible 2023-11-29 14:08:46 -08:00
zfs_debug.c Cleanup: Replace oldstyle struct hack with C99 flexible array members 2023-01-12 16:00:03 -08:00
zfs_dir.c Fix unprotected zfs_znode_dmu_fini 2023-01-19 16:59:05 -08:00
zfs_file_os.c Fix file descriptor leak on pool import. 2024-01-26 13:38:25 -08:00
zfs_ioctl_compat.c freebsd: add ifdefs around legacy ioctl support 2022-11-07 15:55:26 -08:00
zfs_ioctl_os.c FreeBSD: make zfs_vfs_held() definition consistent with declaration 2023-04-21 10:22:52 -07:00
zfs_racct.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zfs_vfsops.c BRT: Fix FICLONE/FICLONERANGE shortened copy 2024-02-06 10:01:15 -08:00
zfs_vnops_os.c FreeBSD: Fix the build on FreeBSD 12 2023-11-28 15:19:07 -08:00
zfs_znode.c Retire z_nr_znodes 2023-09-19 08:52:06 -07:00
zio_crypt.c ZIL: Assert record sizes in different places 2024-01-08 16:11:39 -08:00
zvol_os.c Update the kstat dataset_name when renaming a zvol 2024-01-08 16:11:39 -08:00