xref: /freebsd/sys/contrib/openzfs/config/kernel-vfs-file_range.m4 (revision 315ee00fa9616b0a192b6834911f98bcf5316a6b)
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