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