]> git.proxmox.com Git - mirror_zfs.git/blame - config/kernel-blkdev.m4
Add Linux posix_fadvise support
[mirror_zfs.git] / config / kernel-blkdev.m4
CommitLineData
066e8252
BB
1dnl #
2dnl # 2.6.38 API change,
3dnl # Added blkdev_get_by_path()
4dnl #
5AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH], [
6 ZFS_LINUX_TEST_SRC([blkdev_get_by_path], [
7 #include <linux/fs.h>
1823c8fe 8 #include <linux/blkdev.h>
066e8252
BB
9 ], [
10 struct block_device *bdev __attribute__ ((unused)) = NULL;
11 const char *path = "path";
12 fmode_t mode = 0;
13 void *holder = NULL;
14
15 bdev = blkdev_get_by_path(path, mode, holder);
16 ])
17])
18
19AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_GET_BY_PATH], [
20 AC_MSG_CHECKING([whether blkdev_get_by_path() exists])
21 ZFS_LINUX_TEST_RESULT([blkdev_get_by_path], [
22 AC_MSG_RESULT(yes)
23 ], [
24 ZFS_LINUX_TEST_ERROR([blkdev_get_by_path()])
25 ])
26])
27
28dnl #
29dnl # 2.6.38 API change,
30dnl # Added blkdev_put()
31dnl #
32AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_PUT], [
33 ZFS_LINUX_TEST_SRC([blkdev_put], [
34 #include <linux/fs.h>
1823c8fe 35 #include <linux/blkdev.h>
066e8252
BB
36 ], [
37 struct block_device *bdev = NULL;
38 fmode_t mode = 0;
39
40 blkdev_put(bdev, mode);
41 ])
42])
43
44AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_PUT], [
45 AC_MSG_CHECKING([whether blkdev_put() exists])
46 ZFS_LINUX_TEST_RESULT([blkdev_put], [
47 AC_MSG_RESULT(yes)
48 ], [
49 ZFS_LINUX_TEST_ERROR([blkdev_put()])
50 ])
51])
52
53dnl #
54dnl # 4.1 API, exported blkdev_reread_part() symbol, back ported to the
55dnl # 3.10.0 CentOS 7.x enterprise kernels.
56dnl #
57AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_REREAD_PART], [
58 ZFS_LINUX_TEST_SRC([blkdev_reread_part], [
59 #include <linux/fs.h>
1823c8fe 60 #include <linux/blkdev.h>
066e8252
BB
61 ], [
62 struct block_device *bdev = NULL;
63 int error;
64
65 error = blkdev_reread_part(bdev);
66 ])
67])
68
69AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_REREAD_PART], [
70 AC_MSG_CHECKING([whether blkdev_reread_part() exists])
71 ZFS_LINUX_TEST_RESULT([blkdev_reread_part], [
72 AC_MSG_RESULT(yes)
73 AC_DEFINE(HAVE_BLKDEV_REREAD_PART, 1,
74 [blkdev_reread_part() exists])
75 ], [
76 AC_MSG_RESULT(no)
77 ])
78])
79
ae15f1c1
CK
80dnl #
81dnl # check_disk_change() was removed in 5.10
82dnl #
83AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_CHECK_DISK_CHANGE], [
84 ZFS_LINUX_TEST_SRC([check_disk_change], [
85 #include <linux/fs.h>
86 #include <linux/blkdev.h>
87 ], [
88 struct block_device *bdev = NULL;
89 bool error;
90
91 error = check_disk_change(bdev);
92 ])
93])
94
95AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_CHECK_DISK_CHANGE], [
96 AC_MSG_CHECKING([whether check_disk_change() exists])
97 ZFS_LINUX_TEST_RESULT([check_disk_change], [
98 AC_MSG_RESULT(yes)
99 AC_DEFINE(HAVE_CHECK_DISK_CHANGE, 1,
100 [check_disk_change() exists])
101 ], [
102 AC_MSG_RESULT(no)
103 ])
104])
105
106dnl #
107dnl # 5.10 API, check_disk_change() is removed, in favor of
108dnl # bdev_check_media_change(), which doesn't force revalidation
109dnl #
110AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_CHECK_MEDIA_CHANGE], [
111 ZFS_LINUX_TEST_SRC([bdev_check_media_change], [
112 #include <linux/fs.h>
113 #include <linux/blkdev.h>
114 ], [
115 struct block_device *bdev = NULL;
116 int error;
117
118 error = bdev_check_media_change(bdev);
119 ])
120])
121
122AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_CHECK_MEDIA_CHANGE], [
5bee2659 123 AC_MSG_CHECKING([whether bdev_check_media_change() exists])
ae15f1c1
CK
124 ZFS_LINUX_TEST_RESULT([bdev_check_media_change], [
125 AC_MSG_RESULT(yes)
126 AC_DEFINE(HAVE_BDEV_CHECK_MEDIA_CHANGE, 1,
127 [bdev_check_media_change() exists])
128 ], [
129 AC_MSG_RESULT(no)
130 ])
131])
132
066e8252
BB
133dnl #
134dnl # 2.6.22 API change
135dnl # Single argument invalidate_bdev()
136dnl #
137AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_INVALIDATE_BDEV], [
138 ZFS_LINUX_TEST_SRC([invalidate_bdev], [
139 #include <linux/buffer_head.h>
1823c8fe 140 #include <linux/blkdev.h>
066e8252
BB
141 ],[
142 struct block_device *bdev = NULL;
143 invalidate_bdev(bdev);
144 ])
145])
146
147AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_INVALIDATE_BDEV], [
148 AC_MSG_CHECKING([whether invalidate_bdev() exists])
149 ZFS_LINUX_TEST_RESULT([invalidate_bdev], [
150 AC_MSG_RESULT(yes)
151 ],[
152 ZFS_LINUX_TEST_ERROR([invalidate_bdev()])
153 ])
154])
155
156dnl #
b7281c88
BB
157dnl # 5.11 API, lookup_bdev() takes dev_t argument.
158dnl # 2.6.27 API, lookup_bdev() was first exported.
159dnl # 4.4.0-6.21 API, lookup_bdev() on Ubuntu takes mode argument.
066e8252
BB
160dnl #
161AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_LOOKUP_BDEV], [
b7281c88
BB
162 ZFS_LINUX_TEST_SRC([lookup_bdev_devt], [
163 #include <linux/blkdev.h>
164 ], [
165 int error __attribute__ ((unused));
166 const char path[] = "/example/path";
167 dev_t dev;
168
169 error = lookup_bdev(path, &dev);
170 ])
171
066e8252
BB
172 ZFS_LINUX_TEST_SRC([lookup_bdev_1arg], [
173 #include <linux/fs.h>
1823c8fe 174 #include <linux/blkdev.h>
066e8252 175 ], [
b7281c88
BB
176 struct block_device *bdev __attribute__ ((unused));
177 const char path[] = "/example/path";
178
179 bdev = lookup_bdev(path);
066e8252
BB
180 ])
181
b7281c88 182 ZFS_LINUX_TEST_SRC([lookup_bdev_mode], [
066e8252
BB
183 #include <linux/fs.h>
184 ], [
b7281c88
BB
185 struct block_device *bdev __attribute__ ((unused));
186 const char path[] = "/example/path";
187
188 bdev = lookup_bdev(path, FMODE_READ);
066e8252
BB
189 ])
190])
191
192AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_LOOKUP_BDEV], [
b7281c88
BB
193 AC_MSG_CHECKING([whether lookup_bdev() wants dev_t arg])
194 ZFS_LINUX_TEST_RESULT_SYMBOL([lookup_bdev_devt],
066e8252
BB
195 [lookup_bdev], [fs/block_dev.c], [
196 AC_MSG_RESULT(yes)
b7281c88
BB
197 AC_DEFINE(HAVE_DEVT_LOOKUP_BDEV, 1,
198 [lookup_bdev() wants dev_t arg])
066e8252
BB
199 ], [
200 AC_MSG_RESULT(no)
201
b7281c88
BB
202 AC_MSG_CHECKING([whether lookup_bdev() wants 1 arg])
203 ZFS_LINUX_TEST_RESULT_SYMBOL([lookup_bdev_1arg],
066e8252
BB
204 [lookup_bdev], [fs/block_dev.c], [
205 AC_MSG_RESULT(yes)
b7281c88
BB
206 AC_DEFINE(HAVE_1ARG_LOOKUP_BDEV, 1,
207 [lookup_bdev() wants 1 arg])
066e8252 208 ], [
b7281c88
BB
209 AC_MSG_RESULT(no)
210
211 AC_MSG_CHECKING([whether lookup_bdev() wants mode arg])
212 ZFS_LINUX_TEST_RESULT_SYMBOL([lookup_bdev_mode],
213 [lookup_bdev], [fs/block_dev.c], [
214 AC_MSG_RESULT(yes)
215 AC_DEFINE(HAVE_MODE_LOOKUP_BDEV, 1,
216 [lookup_bdev() wants mode arg])
217 ], [
218 ZFS_LINUX_TEST_ERROR([lookup_bdev()])
219 ])
066e8252
BB
220 ])
221 ])
222])
223
224dnl #
225dnl # 2.6.30 API change
226dnl #
227dnl # The bdev_physical_block_size() interface was added to provide a way
228dnl # to determine the smallest write which can be performed without a
229dnl # read-modify-write operation.
230dnl #
231dnl # Unfortunately, this interface isn't entirely reliable because
232dnl # drives are sometimes known to misreport this value.
233dnl #
234AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_PHYSICAL_BLOCK_SIZE], [
235 ZFS_LINUX_TEST_SRC([bdev_physical_block_size], [
236 #include <linux/blkdev.h>
237 ],[
238 struct block_device *bdev __attribute__ ((unused)) = NULL;
239 bdev_physical_block_size(bdev);
240 ])
241])
242
243AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_PHYSICAL_BLOCK_SIZE], [
244 AC_MSG_CHECKING([whether bdev_physical_block_size() is available])
245 ZFS_LINUX_TEST_RESULT([bdev_physical_block_size], [
246 AC_MSG_RESULT(yes)
247 ],[
248 ZFS_LINUX_TEST_ERROR([bdev_physical_block_size()])
249 ])
250])
251
252dnl #
253dnl # 2.6.30 API change
254dnl # Added bdev_logical_block_size().
255dnl #
256AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_LOGICAL_BLOCK_SIZE], [
257 ZFS_LINUX_TEST_SRC([bdev_logical_block_size], [
258 #include <linux/blkdev.h>
259 ],[
260 struct block_device *bdev __attribute__ ((unused)) = NULL;
261 bdev_logical_block_size(bdev);
262 ])
263])
264
265AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_LOGICAL_BLOCK_SIZE], [
266 AC_MSG_CHECKING([whether bdev_logical_block_size() is available])
267 ZFS_LINUX_TEST_RESULT([bdev_logical_block_size], [
268 AC_MSG_RESULT(yes)
269 ],[
270 ZFS_LINUX_TEST_ERROR([bdev_logical_block_size()])
271 ])
272])
273
72ba4b2a
BB
274dnl #
275dnl # 5.11 API change
276dnl # Added bdev_whole() helper.
277dnl #
278AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_WHOLE], [
279 ZFS_LINUX_TEST_SRC([bdev_whole], [
280 #include <linux/blkdev.h>
281 ],[
282 struct block_device *bdev = NULL;
283 bdev = bdev_whole(bdev);
284 ])
285])
286
287AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE], [
288 AC_MSG_CHECKING([whether bdev_whole() is available])
289 ZFS_LINUX_TEST_RESULT([bdev_whole], [
290 AC_MSG_RESULT(yes)
291 AC_DEFINE(HAVE_BDEV_WHOLE, 1, [bdev_whole() is available])
292 ],[
293 AC_MSG_RESULT(no)
294 ])
295])
296
bebdf52a
BB
297dnl #
298dnl # 5.20 API change,
299dnl # Removed bdevname(), snprintf(.., %pg) should be used.
300dnl #
301AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEVNAME], [
302 ZFS_LINUX_TEST_SRC([bdevname], [
303 #include <linux/fs.h>
304 #include <linux/blkdev.h>
305 ], [
306 struct block_device *bdev __attribute__ ((unused)) = NULL;
307 char path[BDEVNAME_SIZE];
308
309 (void) bdevname(bdev, path);
310 ])
311])
312
313AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEVNAME], [
314 AC_MSG_CHECKING([whether bdevname() exists])
315 ZFS_LINUX_TEST_RESULT([bdevname], [
316 AC_DEFINE(HAVE_BDEVNAME, 1, [bdevname() is available])
317 AC_MSG_RESULT(yes)
318 ], [
319 AC_MSG_RESULT(no)
320 ])
321])
322
a12a5cb5
BB
323dnl #
324dnl # 5.19 API: blkdev_issue_secure_erase()
325dnl # 3.10 API: blkdev_issue_discard(..., BLKDEV_DISCARD_SECURE)
326dnl #
327AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_ISSUE_SECURE_ERASE], [
328 ZFS_LINUX_TEST_SRC([blkdev_issue_secure_erase], [
329 #include <linux/blkdev.h>
330 ],[
331 struct block_device *bdev = NULL;
332 sector_t sector = 0;
333 sector_t nr_sects = 0;
334 int error __attribute__ ((unused));
335
336 error = blkdev_issue_secure_erase(bdev,
337 sector, nr_sects, GFP_KERNEL);
338 ])
339
340 ZFS_LINUX_TEST_SRC([blkdev_issue_discard_flags], [
341 #include <linux/blkdev.h>
342 ],[
343 struct block_device *bdev = NULL;
344 sector_t sector = 0;
345 sector_t nr_sects = 0;
346 unsigned long flags = 0;
347 int error __attribute__ ((unused));
348
349 error = blkdev_issue_discard(bdev,
350 sector, nr_sects, GFP_KERNEL, flags);
351 ])
352])
353
354AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_ISSUE_SECURE_ERASE], [
355 AC_MSG_CHECKING([whether blkdev_issue_secure_erase() is available])
356 ZFS_LINUX_TEST_RESULT([blkdev_issue_secure_erase], [
357 AC_MSG_RESULT(yes)
358 AC_DEFINE(HAVE_BLKDEV_ISSUE_SECURE_ERASE, 1,
359 [blkdev_issue_secure_erase() is available])
360 ],[
361 AC_MSG_RESULT(no)
362
363 AC_MSG_CHECKING([whether blkdev_issue_discard() is available])
364 ZFS_LINUX_TEST_RESULT([blkdev_issue_discard_flags], [
365 AC_MSG_RESULT(yes)
366 AC_DEFINE(HAVE_BLKDEV_ISSUE_DISCARD, 1,
367 [blkdev_issue_discard() is available])
368 ],[
369 ZFS_LINUX_TEST_ERROR([blkdev_issue_discard()])
370 ])
371 ])
372])
373
77e2756d
BB
374dnl #
375dnl # 5.13 API change
376dnl # blkdev_get_by_path() no longer handles ERESTARTSYS
377dnl #
378dnl # Unfortunately we're forced to rely solely on the kernel version
379dnl # number in order to determine the expected behavior. This was an
380dnl # internal change to blkdev_get_by_dev(), see commit a8ed1a0607.
381dnl #
382AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS], [
383 AC_MSG_CHECKING([whether blkdev_get_by_path() handles ERESTARTSYS])
384 AS_VERSION_COMPARE([$LINUX_VERSION], [5.13.0], [
385 AC_MSG_RESULT(yes)
386 AC_DEFINE(HAVE_BLKDEV_GET_ERESTARTSYS, 1,
387 [blkdev_get_by_path() handles ERESTARTSYS])
388 ],[
389 AC_MSG_RESULT(no)
390 ],[
391 AC_MSG_RESULT(no)
392 ])
393])
394
066e8252
BB
395AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
396 ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH
397 ZFS_AC_KERNEL_SRC_BLKDEV_PUT
398 ZFS_AC_KERNEL_SRC_BLKDEV_REREAD_PART
399 ZFS_AC_KERNEL_SRC_BLKDEV_INVALIDATE_BDEV
400 ZFS_AC_KERNEL_SRC_BLKDEV_LOOKUP_BDEV
401 ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_LOGICAL_BLOCK_SIZE
402 ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_PHYSICAL_BLOCK_SIZE
ae15f1c1
CK
403 ZFS_AC_KERNEL_SRC_BLKDEV_CHECK_DISK_CHANGE
404 ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_CHECK_MEDIA_CHANGE
72ba4b2a 405 ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_WHOLE
bebdf52a 406 ZFS_AC_KERNEL_SRC_BLKDEV_BDEVNAME
a12a5cb5 407 ZFS_AC_KERNEL_SRC_BLKDEV_ISSUE_SECURE_ERASE
066e8252
BB
408])
409
410AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
411 ZFS_AC_KERNEL_BLKDEV_GET_BY_PATH
412 ZFS_AC_KERNEL_BLKDEV_PUT
413 ZFS_AC_KERNEL_BLKDEV_REREAD_PART
414 ZFS_AC_KERNEL_BLKDEV_INVALIDATE_BDEV
415 ZFS_AC_KERNEL_BLKDEV_LOOKUP_BDEV
416 ZFS_AC_KERNEL_BLKDEV_BDEV_LOGICAL_BLOCK_SIZE
417 ZFS_AC_KERNEL_BLKDEV_BDEV_PHYSICAL_BLOCK_SIZE
ae15f1c1
CK
418 ZFS_AC_KERNEL_BLKDEV_CHECK_DISK_CHANGE
419 ZFS_AC_KERNEL_BLKDEV_BDEV_CHECK_MEDIA_CHANGE
72ba4b2a 420 ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE
bebdf52a 421 ZFS_AC_KERNEL_BLKDEV_BDEVNAME
77e2756d 422 ZFS_AC_KERNEL_BLKDEV_GET_ERESTARTSYS
a12a5cb5 423 ZFS_AC_KERNEL_BLKDEV_ISSUE_SECURE_ERASE
066e8252 424])