1*315ee00fSMartin Matuskadnl # 2*315ee00fSMartin Matuskadnl # The *_file_range APIs have a long history: 3*315ee00fSMartin Matuskadnl # 4*315ee00fSMartin Matuskadnl # 2.6.29: BTRFS_IOC_CLONE and BTRFS_IOC_CLONE_RANGE ioctl introduced 5*315ee00fSMartin Matuskadnl # 3.12: BTRFS_IOC_FILE_EXTENT_SAME ioctl introduced 6*315ee00fSMartin Matuskadnl # 7*315ee00fSMartin Matuskadnl # 4.5: copy_file_range() syscall introduced, added to VFS 8*315ee00fSMartin Matuskadnl # 4.5: BTRFS_IOC_CLONE and BTRFS_IOC_CLONE_RANGE renamed to FICLONE ands 9*315ee00fSMartin Matuskadnl # FICLONERANGE, added to VFS as clone_file_range() 10*315ee00fSMartin Matuskadnl # 4.5: BTRFS_IOC_FILE_EXTENT_SAME renamed to FIDEDUPERANGE, added to VFS 11*315ee00fSMartin Matuskadnl # as dedupe_file_range() 12*315ee00fSMartin Matuskadnl # 13*315ee00fSMartin Matuskadnl # 4.20: VFS clone_file_range() and dedupe_file_range() replaced by 14*315ee00fSMartin Matuskadnl # remap_file_range() 15*315ee00fSMartin Matuskadnl # 16*315ee00fSMartin Matuskadnl # 5.3: VFS copy_file_range() expected to do its own fallback, 17*315ee00fSMartin Matuskadnl # generic_copy_file_range() added to support it 18*315ee00fSMartin Matuskadnl # 19*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_COPY_FILE_RANGE], [ 20*315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_copy_file_range], [ 21*315ee00fSMartin Matuska #include <linux/fs.h> 22*315ee00fSMartin Matuska 23*315ee00fSMartin Matuska static ssize_t test_copy_file_range(struct file *src_file, 24*315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 25*315ee00fSMartin Matuska size_t len, unsigned int flags) { 26*315ee00fSMartin Matuska (void) src_file; (void) src_off; 27*315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 28*315ee00fSMartin Matuska (void) len; (void) flags; 29*315ee00fSMartin Matuska return (0); 30*315ee00fSMartin Matuska } 31*315ee00fSMartin Matuska 32*315ee00fSMartin Matuska static const struct file_operations 33*315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 34*315ee00fSMartin Matuska .copy_file_range = test_copy_file_range, 35*315ee00fSMartin Matuska }; 36*315ee00fSMartin Matuska ],[]) 37*315ee00fSMartin Matuska]) 38*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_COPY_FILE_RANGE], [ 39*315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->copy_file_range() is available]) 40*315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_copy_file_range], [ 41*315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 42*315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_COPY_FILE_RANGE, 1, 43*315ee00fSMartin Matuska [fops->copy_file_range() is available]) 44*315ee00fSMartin Matuska ],[ 45*315ee00fSMartin Matuska AC_MSG_RESULT([no]) 46*315ee00fSMartin Matuska ]) 47*315ee00fSMartin Matuska]) 48*315ee00fSMartin Matuska 49*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_GENERIC_COPY_FILE_RANGE], [ 50*315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([generic_copy_file_range], [ 51*315ee00fSMartin Matuska #include <linux/fs.h> 52*315ee00fSMartin Matuska ], [ 53*315ee00fSMartin Matuska struct file *src_file __attribute__ ((unused)) = NULL; 54*315ee00fSMartin Matuska loff_t src_off __attribute__ ((unused)) = 0; 55*315ee00fSMartin Matuska struct file *dst_file __attribute__ ((unused)) = NULL; 56*315ee00fSMartin Matuska loff_t dst_off __attribute__ ((unused)) = 0; 57*315ee00fSMartin Matuska size_t len __attribute__ ((unused)) = 0; 58*315ee00fSMartin Matuska unsigned int flags __attribute__ ((unused)) = 0; 59*315ee00fSMartin Matuska generic_copy_file_range(src_file, src_off, dst_file, dst_off, 60*315ee00fSMartin Matuska len, flags); 61*315ee00fSMartin Matuska ]) 62*315ee00fSMartin Matuska]) 63*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE], [ 64*315ee00fSMartin Matuska AC_MSG_CHECKING([whether generic_copy_file_range() is available]) 65*315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT_SYMBOL([generic_copy_file_range], 66*315ee00fSMartin Matuska [generic_copy_file_range], [fs/read_write.c], [ 67*315ee00fSMartin Matuska AC_MSG_RESULT(yes) 68*315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_GENERIC_COPY_FILE_RANGE, 1, 69*315ee00fSMartin Matuska [generic_copy_file_range() is available]) 70*315ee00fSMartin Matuska ],[ 71*315ee00fSMartin Matuska AC_MSG_RESULT(no) 72*315ee00fSMartin Matuska ]) 73*315ee00fSMartin Matuska]) 74*315ee00fSMartin Matuska 75*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE], [ 76*315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_clone_file_range], [ 77*315ee00fSMartin Matuska #include <linux/fs.h> 78*315ee00fSMartin Matuska 79*315ee00fSMartin Matuska static int test_clone_file_range(struct file *src_file, 80*315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 81*315ee00fSMartin Matuska u64 len) { 82*315ee00fSMartin Matuska (void) src_file; (void) src_off; 83*315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 84*315ee00fSMartin Matuska (void) len; 85*315ee00fSMartin Matuska return (0); 86*315ee00fSMartin Matuska } 87*315ee00fSMartin Matuska 88*315ee00fSMartin Matuska static const struct file_operations 89*315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 90*315ee00fSMartin Matuska .clone_file_range = test_clone_file_range, 91*315ee00fSMartin Matuska }; 92*315ee00fSMartin Matuska ],[]) 93*315ee00fSMartin Matuska]) 94*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_CLONE_FILE_RANGE], [ 95*315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->clone_file_range() is available]) 96*315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_clone_file_range], [ 97*315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 98*315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_CLONE_FILE_RANGE, 1, 99*315ee00fSMartin Matuska [fops->clone_file_range() is available]) 100*315ee00fSMartin Matuska ],[ 101*315ee00fSMartin Matuska AC_MSG_RESULT([no]) 102*315ee00fSMartin Matuska ]) 103*315ee00fSMartin Matuska]) 104*315ee00fSMartin Matuska 105*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_DEDUPE_FILE_RANGE], [ 106*315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_dedupe_file_range], [ 107*315ee00fSMartin Matuska #include <linux/fs.h> 108*315ee00fSMartin Matuska 109*315ee00fSMartin Matuska static int test_dedupe_file_range(struct file *src_file, 110*315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 111*315ee00fSMartin Matuska u64 len) { 112*315ee00fSMartin Matuska (void) src_file; (void) src_off; 113*315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 114*315ee00fSMartin Matuska (void) len; 115*315ee00fSMartin Matuska return (0); 116*315ee00fSMartin Matuska } 117*315ee00fSMartin Matuska 118*315ee00fSMartin Matuska static const struct file_operations 119*315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 120*315ee00fSMartin Matuska .dedupe_file_range = test_dedupe_file_range, 121*315ee00fSMartin Matuska }; 122*315ee00fSMartin Matuska ],[]) 123*315ee00fSMartin Matuska]) 124*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_DEDUPE_FILE_RANGE], [ 125*315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->dedupe_file_range() is available]) 126*315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_dedupe_file_range], [ 127*315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 128*315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_DEDUPE_FILE_RANGE, 1, 129*315ee00fSMartin Matuska [fops->dedupe_file_range() is available]) 130*315ee00fSMartin Matuska ],[ 131*315ee00fSMartin Matuska AC_MSG_RESULT([no]) 132*315ee00fSMartin Matuska ]) 133*315ee00fSMartin Matuska]) 134*315ee00fSMartin Matuska 135*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_REMAP_FILE_RANGE], [ 136*315ee00fSMartin Matuska ZFS_LINUX_TEST_SRC([vfs_remap_file_range], [ 137*315ee00fSMartin Matuska #include <linux/fs.h> 138*315ee00fSMartin Matuska 139*315ee00fSMartin Matuska static loff_t test_remap_file_range(struct file *src_file, 140*315ee00fSMartin Matuska loff_t src_off, struct file *dst_file, loff_t dst_off, 141*315ee00fSMartin Matuska loff_t len, unsigned int flags) { 142*315ee00fSMartin Matuska (void) src_file; (void) src_off; 143*315ee00fSMartin Matuska (void) dst_file; (void) dst_off; 144*315ee00fSMartin Matuska (void) len; (void) flags; 145*315ee00fSMartin Matuska return (0); 146*315ee00fSMartin Matuska } 147*315ee00fSMartin Matuska 148*315ee00fSMartin Matuska static const struct file_operations 149*315ee00fSMartin Matuska fops __attribute__ ((unused)) = { 150*315ee00fSMartin Matuska .remap_file_range = test_remap_file_range, 151*315ee00fSMartin Matuska }; 152*315ee00fSMartin Matuska ],[]) 153*315ee00fSMartin Matuska]) 154*315ee00fSMartin Matuska 155*315ee00fSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_VFS_REMAP_FILE_RANGE], [ 156*315ee00fSMartin Matuska AC_MSG_CHECKING([whether fops->remap_file_range() is available]) 157*315ee00fSMartin Matuska ZFS_LINUX_TEST_RESULT([vfs_remap_file_range], [ 158*315ee00fSMartin Matuska AC_MSG_RESULT([yes]) 159*315ee00fSMartin Matuska AC_DEFINE(HAVE_VFS_REMAP_FILE_RANGE, 1, 160*315ee00fSMartin Matuska [fops->remap_file_range() is available]) 161*315ee00fSMartin Matuska ],[ 162*315ee00fSMartin Matuska AC_MSG_RESULT([no]) 163*315ee00fSMartin Matuska ]) 164*315ee00fSMartin Matuska]) 165