1315ee00fSMartin Matuskadnl # 2315ee00fSMartin Matuskadnl # The *_file_range APIs have a long history: 3315ee00fSMartin Matuskadnl # 4315ee00fSMartin Matuskadnl # 2.6.29: BTRFS_IOC_CLONE and BTRFS_IOC_CLONE_RANGE ioctl introduced 5315ee00fSMartin Matuskadnl # 3.12: BTRFS_IOC_FILE_EXTENT_SAME ioctl introduced 6315ee00fSMartin Matuskadnl # 7315ee00fSMartin Matuskadnl # 4.5: copy_file_range() syscall introduced, added to VFS 8315ee00fSMartin Matuskadnl # 4.5: BTRFS_IOC_CLONE and BTRFS_IOC_CLONE_RANGE renamed to FICLONE ands 9315ee00fSMartin Matuskadnl # FICLONERANGE, added to VFS as clone_file_range() 10315ee00fSMartin Matuskadnl # 4.5: BTRFS_IOC_FILE_EXTENT_SAME renamed to FIDEDUPERANGE, added to VFS 11315ee00fSMartin Matuskadnl # as dedupe_file_range() 12315ee00fSMartin Matuskadnl # 13315ee00fSMartin Matuskadnl # 4.20: VFS clone_file_range() and dedupe_file_range() replaced by 14315ee00fSMartin Matuskadnl # remap_file_range() 15315ee00fSMartin Matuskadnl # 16315ee00fSMartin Matuskadnl # 5.3: VFS copy_file_range() expected to do its own fallback, 17315ee00fSMartin Matuskadnl # generic_copy_file_range() added to support it 18315ee00fSMartin Matuskadnl # 19*783d3ff6SMartin Matuskadnl # 6.8: generic_copy_file_range() removed, replaced by 20*783d3ff6SMartin Matuskadnl # splice_copy_file_range() 21*783d3ff6SMartin Matuskadnl # 22315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_GENERIC_COPY_FILE_RANGE], [ 23315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([generic_copy_file_range], [ 24315ee00fSMartin Matuska #include <linux/fs.h> 25315ee00fSMartin Matuska ], [ 26315ee00fSMartin Matuska struct file *src_file __attribute__ ((unused)) = NULL; 27315ee00fSMartin Matuska loff_t src_off __attribute__ ((unused)) = 0; 28315ee00fSMartin Matuska struct file *dst_file __attribute__ ((unused)) = NULL; 29315ee00fSMartin Matuska loff_t dst_off __attribute__ ((unused)) = 0; 30315ee00fSMartin Matuska size_t len __attribute__ ((unused)) = 0; 31315ee00fSMartin Matuska unsigned int flags __attribute__ ((unused)) = 0; 32315ee00fSMartin Matuska generic_copy_file_range(src_file, src_off, dst_file, dst_off, 33315ee00fSMartin Matuska len, flags); 34315ee00fSMartin Matuska ]) 35315ee00fSMartin Matuska]) 36315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE], [ 37315ee00fSMartin Matuska AC_MSG_CHECKING([whether generic_copy_file_range() is available]) 38315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT_SYMBOL([generic_copy_file_range], 39315ee00fSMartin Matuska [generic_copy_file_range], [fs/read_write.c], [ 40315ee00fSMartin Matuska AC_MSG_RESULT(yes) 41315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_GENERIC_COPY_FILE_RANGE, 1, 42315ee00fSMartin Matuska [generic_copy_file_range() is available]) 43315ee00fSMartin Matuska ],[ 44315ee00fSMartin Matuska AC_MSG_RESULT(no) 45315ee00fSMartin Matuska ]) 46315ee00fSMartin Matuska]) 47315ee00fSMartin Matuska 48*783d3ff6SMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_SPLICE_COPY_FILE_RANGE], [ 49*783d3ff6SMartin Matuska ZFS_LINUX_TEST_SRC([splice_copy_file_range], [ 50*783d3ff6SMartin Matuska #include <linux/splice.h> 51*783d3ff6SMartin Matuska ], [ 52*783d3ff6SMartin Matuska struct file *src_file __attribute__ ((unused)) = NULL; 53*783d3ff6SMartin Matuska loff_t src_off __attribute__ ((unused)) = 0; 54*783d3ff6SMartin Matuska struct file *dst_file __attribute__ ((unused)) = NULL; 55*783d3ff6SMartin Matuska loff_t dst_off __attribute__ ((unused)) = 0; 56*783d3ff6SMartin Matuska size_t len __attribute__ ((unused)) = 0; 57*783d3ff6SMartin Matuska splice_copy_file_range(src_file, src_off, dst_file, dst_off, 58*783d3ff6SMartin Matuska len); 59*783d3ff6SMartin Matuska ]) 60*783d3ff6SMartin Matuska]) 61*783d3ff6SMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_SPLICE_COPY_FILE_RANGE], [ 62*783d3ff6SMartin Matuska AC_MSG_CHECKING([whether splice_copy_file_range() is available]) 63*783d3ff6SMartin Matuska ZFS_LINUX_TEST_RESULT([splice_copy_file_range], [ 64*783d3ff6SMartin Matuska AC_MSG_RESULT(yes) 65*783d3ff6SMartin Matuska AC_DEFINE(HAVE_VFS_SPLICE_COPY_FILE_RANGE, 1, 66*783d3ff6SMartin Matuska [splice_copy_file_range() is available]) 67*783d3ff6SMartin Matuska ],[ 68*783d3ff6SMartin Matuska AC_MSG_RESULT(no) 69*783d3ff6SMartin Matuska ]) 70*783d3ff6SMartin Matuska]) 71*783d3ff6SMartin Matuska 72315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE], [ 73315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_clone_file_range], [ 74315ee00fSMartin Matuska #include <linux/fs.h> 75315ee00fSMartin Matuska 76315ee00fSMartin Matuska static int test_clone_file_range(struct file *src_file, 77315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 78315ee00fSMartin Matuska u64 len) { 79315ee00fSMartin Matuska (void) src_file; (void) src_off; 80315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 81315ee00fSMartin Matuska (void) len; 82315ee00fSMartin Matuska return (0); 83315ee00fSMartin Matuska } 84315ee00fSMartin Matuska 85315ee00fSMartin Matuska static const struct file_operations 86315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 87315ee00fSMartin Matuska .clone_file_range = test_clone_file_range, 88315ee00fSMartin Matuska }; 89315ee00fSMartin Matuska ],[]) 90315ee00fSMartin Matuska]) 91315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_CLONE_FILE_RANGE], [ 92315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->clone_file_range() is available]) 93315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_clone_file_range], [ 94315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 95315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_CLONE_FILE_RANGE, 1, 96315ee00fSMartin Matuska [fops->clone_file_range() is available]) 97315ee00fSMartin Matuska ],[ 98315ee00fSMartin Matuska AC_MSG_RESULT([no]) 99315ee00fSMartin Matuska ]) 100315ee00fSMartin Matuska]) 101315ee00fSMartin Matuska 102315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_DEDUPE_FILE_RANGE], [ 103315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_dedupe_file_range], [ 104315ee00fSMartin Matuska #include <linux/fs.h> 105315ee00fSMartin Matuska 106315ee00fSMartin Matuska static int test_dedupe_file_range(struct file *src_file, 107315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 108315ee00fSMartin Matuska u64 len) { 109315ee00fSMartin Matuska (void) src_file; (void) src_off; 110315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 111315ee00fSMartin Matuska (void) len; 112315ee00fSMartin Matuska return (0); 113315ee00fSMartin Matuska } 114315ee00fSMartin Matuska 115315ee00fSMartin Matuska static const struct file_operations 116315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 117315ee00fSMartin Matuska .dedupe_file_range = test_dedupe_file_range, 118315ee00fSMartin Matuska }; 119315ee00fSMartin Matuska ],[]) 120315ee00fSMartin Matuska]) 121315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_DEDUPE_FILE_RANGE], [ 122315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->dedupe_file_range() is available]) 123315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_dedupe_file_range], [ 124315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 125315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_DEDUPE_FILE_RANGE, 1, 126315ee00fSMartin Matuska [fops->dedupe_file_range() is available]) 127315ee00fSMartin Matuska ],[ 128315ee00fSMartin Matuska AC_MSG_RESULT([no]) 129315ee00fSMartin Matuska ]) 130315ee00fSMartin Matuska]) 131315ee00fSMartin Matuska 132315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_REMAP_FILE_RANGE], [ 133315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_remap_file_range], [ 134315ee00fSMartin Matuska #include <linux/fs.h> 135315ee00fSMartin Matuska 136315ee00fSMartin Matuska static loff_t test_remap_file_range(struct file *src_file, 137315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 138315ee00fSMartin Matuska loff_t len, unsigned int flags) { 139315ee00fSMartin Matuska (void) src_file; (void) src_off; 140315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 141315ee00fSMartin Matuska (void) len; (void) flags; 142315ee00fSMartin Matuska return (0); 143315ee00fSMartin Matuska } 144315ee00fSMartin Matuska 145315ee00fSMartin Matuska static const struct file_operations 146315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 147315ee00fSMartin Matuska .remap_file_range = test_remap_file_range, 148315ee00fSMartin Matuska }; 149315ee00fSMartin Matuska ],[]) 150315ee00fSMartin Matuska]) 151315ee00fSMartin Matuska 152315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_REMAP_FILE_RANGE], [ 153315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->remap_file_range() is available]) 154315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_remap_file_range], [ 155315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 156315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_REMAP_FILE_RANGE, 1, 157315ee00fSMartin Matuska [fops->remap_file_range() is available]) 158315ee00fSMartin Matuska ],[ 159315ee00fSMartin Matuska AC_MSG_RESULT([no]) 160315ee00fSMartin Matuska ]) 161315ee00fSMartin Matuska]) 162