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_COPY_FILE_RANGE], [ 23315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_copy_file_range], [ 24315ee00fSMartin Matuska #include <linux/fs.h> 25315ee00fSMartin Matuska 26315ee00fSMartin Matuska static ssize_t test_copy_file_range(struct file *src_file, 27315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 28315ee00fSMartin Matuska size_t len, unsigned int flags) { 29315ee00fSMartin Matuska (void) src_file; (void) src_off; 30315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 31315ee00fSMartin Matuska (void) len; (void) flags; 32315ee00fSMartin Matuska return (0); 33315ee00fSMartin Matuska } 34315ee00fSMartin Matuska 35315ee00fSMartin Matuska static const struct file_operations 36315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 37315ee00fSMartin Matuska .copy_file_range = test_copy_file_range, 38315ee00fSMartin Matuska }; 39315ee00fSMartin Matuska ],[]) 40315ee00fSMartin Matuska]) 41315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_COPY_FILE_RANGE], [ 42315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->copy_file_range() is available]) 43315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_copy_file_range], [ 44315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 45315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_COPY_FILE_RANGE, 1, 46315ee00fSMartin Matuska [fops->copy_file_range() is available]) 47315ee00fSMartin Matuska ],[ 48315ee00fSMartin Matuska AC_MSG_RESULT([no]) 49315ee00fSMartin Matuska ]) 50315ee00fSMartin Matuska]) 51315ee00fSMartin Matuska 52315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_GENERIC_COPY_FILE_RANGE], [ 53315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([generic_copy_file_range], [ 54315ee00fSMartin Matuska #include <linux/fs.h> 55315ee00fSMartin Matuska ], [ 56315ee00fSMartin Matuska struct file *src_file __attribute__ ((unused)) = NULL; 57315ee00fSMartin Matuska loff_t src_off __attribute__ ((unused)) = 0; 58315ee00fSMartin Matuska struct file *dst_file __attribute__ ((unused)) = NULL; 59315ee00fSMartin Matuska loff_t dst_off __attribute__ ((unused)) = 0; 60315ee00fSMartin Matuska size_t len __attribute__ ((unused)) = 0; 61315ee00fSMartin Matuska unsigned int flags __attribute__ ((unused)) = 0; 62315ee00fSMartin Matuska generic_copy_file_range(src_file, src_off, dst_file, dst_off, 63315ee00fSMartin Matuska len, flags); 64315ee00fSMartin Matuska ]) 65315ee00fSMartin Matuska]) 66315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE], [ 67315ee00fSMartin Matuska AC_MSG_CHECKING([whether generic_copy_file_range() is available]) 68315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT_SYMBOL([generic_copy_file_range], 69315ee00fSMartin Matuska [generic_copy_file_range], [fs/read_write.c], [ 70315ee00fSMartin Matuska AC_MSG_RESULT(yes) 71315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_GENERIC_COPY_FILE_RANGE, 1, 72315ee00fSMartin Matuska [generic_copy_file_range() is available]) 73315ee00fSMartin Matuska ],[ 74315ee00fSMartin Matuska AC_MSG_RESULT(no) 75315ee00fSMartin Matuska ]) 76315ee00fSMartin Matuska]) 77315ee00fSMartin Matuska 78*783d3ff6SMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_SPLICE_COPY_FILE_RANGE], [ 79*783d3ff6SMartin Matuska ZFS_LINUX_TEST_SRC([splice_copy_file_range], [ 80*783d3ff6SMartin Matuska #include <linux/splice.h> 81*783d3ff6SMartin Matuska ], [ 82*783d3ff6SMartin Matuska struct file *src_file __attribute__ ((unused)) = NULL; 83*783d3ff6SMartin Matuska loff_t src_off __attribute__ ((unused)) = 0; 84*783d3ff6SMartin Matuska struct file *dst_file __attribute__ ((unused)) = NULL; 85*783d3ff6SMartin Matuska loff_t dst_off __attribute__ ((unused)) = 0; 86*783d3ff6SMartin Matuska size_t len __attribute__ ((unused)) = 0; 87*783d3ff6SMartin Matuska splice_copy_file_range(src_file, src_off, dst_file, dst_off, 88*783d3ff6SMartin Matuska len); 89*783d3ff6SMartin Matuska ]) 90*783d3ff6SMartin Matuska]) 91*783d3ff6SMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_SPLICE_COPY_FILE_RANGE], [ 92*783d3ff6SMartin Matuska AC_MSG_CHECKING([whether splice_copy_file_range() is available]) 93*783d3ff6SMartin Matuska ZFS_LINUX_TEST_RESULT([splice_copy_file_range], [ 94*783d3ff6SMartin Matuska AC_MSG_RESULT(yes) 95*783d3ff6SMartin Matuska AC_DEFINE(HAVE_VFS_SPLICE_COPY_FILE_RANGE, 1, 96*783d3ff6SMartin Matuska [splice_copy_file_range() is available]) 97*783d3ff6SMartin Matuska ],[ 98*783d3ff6SMartin Matuska AC_MSG_RESULT(no) 99*783d3ff6SMartin Matuska ]) 100*783d3ff6SMartin Matuska]) 101*783d3ff6SMartin Matuska 102315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE], [ 103315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_clone_file_range], [ 104315ee00fSMartin Matuska #include <linux/fs.h> 105315ee00fSMartin Matuska 106315ee00fSMartin Matuska static int test_clone_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 .clone_file_range = test_clone_file_range, 118315ee00fSMartin Matuska }; 119315ee00fSMartin Matuska ],[]) 120315ee00fSMartin Matuska]) 121315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_CLONE_FILE_RANGE], [ 122315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->clone_file_range() is available]) 123315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_clone_file_range], [ 124315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 125315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_CLONE_FILE_RANGE, 1, 126315ee00fSMartin Matuska [fops->clone_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_DEDUPE_FILE_RANGE], [ 133315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_dedupe_file_range], [ 134315ee00fSMartin Matuska #include <linux/fs.h> 135315ee00fSMartin Matuska 136315ee00fSMartin Matuska static int test_dedupe_file_range(struct file *src_file, 137315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 138315ee00fSMartin Matuska u64 len) { 139315ee00fSMartin Matuska (void) src_file; (void) src_off; 140315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 141315ee00fSMartin Matuska (void) len; 142315ee00fSMartin Matuska return (0); 143315ee00fSMartin Matuska } 144315ee00fSMartin Matuska 145315ee00fSMartin Matuska static const struct file_operations 146315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 147315ee00fSMartin Matuska .dedupe_file_range = test_dedupe_file_range, 148315ee00fSMartin Matuska }; 149315ee00fSMartin Matuska ],[]) 150315ee00fSMartin Matuska]) 151315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_DEDUPE_FILE_RANGE], [ 152315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->dedupe_file_range() is available]) 153315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_dedupe_file_range], [ 154315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 155315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_DEDUPE_FILE_RANGE, 1, 156315ee00fSMartin Matuska [fops->dedupe_file_range() is available]) 157315ee00fSMartin Matuska ],[ 158315ee00fSMartin Matuska AC_MSG_RESULT([no]) 159315ee00fSMartin Matuska ]) 160315ee00fSMartin Matuska]) 161315ee00fSMartin Matuska 162315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_REMAP_FILE_RANGE], [ 163315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_remap_file_range], [ 164315ee00fSMartin Matuska #include <linux/fs.h> 165315ee00fSMartin Matuska 166315ee00fSMartin Matuska static loff_t test_remap_file_range(struct file *src_file, 167315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 168315ee00fSMartin Matuska loff_t len, unsigned int flags) { 169315ee00fSMartin Matuska (void) src_file; (void) src_off; 170315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 171315ee00fSMartin Matuska (void) len; (void) flags; 172315ee00fSMartin Matuska return (0); 173315ee00fSMartin Matuska } 174315ee00fSMartin Matuska 175315ee00fSMartin Matuska static const struct file_operations 176315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 177315ee00fSMartin Matuska .remap_file_range = test_remap_file_range, 178315ee00fSMartin Matuska }; 179315ee00fSMartin Matuska ],[]) 180315ee00fSMartin Matuska]) 181315ee00fSMartin Matuska 182315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_REMAP_FILE_RANGE], [ 183315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->remap_file_range() is available]) 184315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_remap_file_range], [ 185315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 186315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_REMAP_FILE_RANGE, 1, 187315ee00fSMartin Matuska [fops->remap_file_range() is available]) 188315ee00fSMartin Matuska ],[ 189315ee00fSMartin Matuska AC_MSG_RESULT([no]) 190315ee00fSMartin Matuska ]) 191315ee00fSMartin Matuska]) 192