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