1 AC_DEFUN([LINUX_EXPORTS_TASKLIST_LOCK], [
2 AC_CHECK_LINUX_BUILD([for exported tasklist_lock],
3 [ac_cv_linux_exports_tasklist_lock],
4 [#include <linux/sched.h>],
6 extern rwlock_t tasklist_lock __attribute__((weak));
7 read_lock(&tasklist_lock);
9 [EXPORTED_TASKLIST_LOCK],
10 [define if tasklist_lock exported])
13 AC_DEFUN([LINUX_COMPLETION_H_EXISTS], [
14 AC_CHECK_LINUX_BUILD([for linux/completion.h],
15 [ac_cv_linux_completion_h_exists],
16 [#include <linux/version.h>
17 #include <linux/completion.h>],
18 [struct completion _c;
19 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,4,8)
22 [HAVE_LINUX_COMPLETION_H]
23 [Define if your kernel has a usable linux/completion.h])
27 AC_DEFUN([LINUX_EXPORTS_INIT_MM], [
28 AC_CHECK_LINUX_BUILD([for exported init_mm],
29 [ac_cv_linux_exports_init_mm],
30 [extern struct mm_struct init_mm;],
31 [void *address = &init_mm; printk("%p\n", address);],
33 [define if your kernel exports init_mm])
37 AC_DEFUN([LINUX_EXPORTS_KALLSYMS_ADDRESS], [
38 AC_CHECK_LINUX_BUILD([for exported kallsyms_address_to_symbol],
39 [ac_cv_linux_exports_kallsyms_address],
40 [#include <linux/modversions.h>],
41 [#ifndef __ver_kallsyms_address_to_symbol
42 #error kallsyms_address_to_symbol not exported
44 [EXPORTED_KALLSYMS_ADDRESS],
45 [define if your linux kernel exports kallsyms address])
49 AC_DEFUN([LINUX_EXPORTS_KALLSYMS_SYMBOL], [
50 AC_CHECK_LINUX_BUILD([for exported kallsyms_symbol_to_address],
51 [ac_cv_linux_exports_kallsyms_symbol],
52 [#include <linux/modversions.h>],
53 [#ifndef __ver_kallsyms_symbol_to_address
54 #error kallsyms_symbol_to_address not exported
56 [EXPORTED_KALLSYMS_SYMBOL],
57 [define if your linux kernel exports kallsyms])
61 AC_DEFUN([LINUX_EXPORTS_SYS_CALL_TABLE], [
62 AC_CHECK_LINUX_BUILD([for exported sys_call_table],
63 [ac_cv_linux_exports_sys_call_table],
64 [#include <linux/modversions.h>],
65 [#ifndef __ver_sys_call_table
66 #error sys_call_table not exported
68 [EXPORTED_SYS_CALL_TABLE],
69 [define if your linux kernel exports sys_call_table])
73 AC_DEFUN([LINUX_EXPORTS_IA32_SYS_CALL_TABLE], [
74 AC_CHECK_LINUX_BUILD([for exported ia32_sys_call_table],
75 [ac_cv_linux_exports_ia32_sys_call_table],
76 [#include <linux/modversions.h>],
77 [#ifndef __ver_ia32_sys_call_table
78 #error ia32_sys_call_table not exported
80 [EXPORTED_IA32_SYS_CALL_TABLE],
81 [define if your linux kernel exports ia32_sys_call_table])
85 AC_DEFUN([LINUX_EXPORTS_SYS_CHDIR], [
86 AC_CHECK_LINUX_BUILD([for exported sys_chdir],
87 [ac_cv_linux_exports_sys_chdir],
88 [extern asmlinkage long sys_chdir(void) __attribute__((weak));],
89 [void *address = &sys_chdir; printk("%p\n", address);],
91 [define if your linux kernel exports sys_chdir])
95 AC_DEFUN([LINUX_EXPORTS_SYS_OPEN], [
96 AC_CHECK_LINUX_BUILD([for exported sys_open],
97 [ac_cv_linux_exports_sys_open],
98 [extern asmlinkage long sys_open(void) __attribute__((weak));],
99 [void *address = &sys_open; printk("%p\n", address);],
101 [define if your linux kernel exports sys_open])
105 AC_DEFUN([LINUX_RECALC_SIGPENDING_ARG_TYPE], [
106 AC_CHECK_LINUX_BUILD([for recalc_sigpending arg type],
107 [ac_cv_linux_func_recalc_sigpending_takes_void],
108 [#include <linux/sched.h>],
109 [recalc_sigpending();],
110 [RECALC_SIGPENDING_TAKES_VOID],
111 [define if your recalc_sigpending takes void])
115 AC_DEFUN([LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_SIGNAL_RLIM], [
116 AC_CHECK_LINUX_BUILD([for signal->rlim in struct task_struct],
117 [ac_cv_linux_sched_struct_task_struct_has_signal_rlim],
118 [#include <linux/sched.h>],
119 [struct task_struct _tsk; printk("%d\n", _tsk.signal->rlim);],
120 [STRUCT_TASK_STRUCT_HAS_SIGNAL_RLIM],
121 [define if your struct task_struct has signal->rlim])
125 AC_DEFUN([LINUX_KERNEL_POSIX_LOCK_FILE_WAIT_ARG], [
126 AC_CHECK_LINUX_BUILD([for 3rd argument in posix_lock_file found in new kernels],
127 [ac_cv_linux_kernel_posix_lock_file_wait_arg],
128 [#include <linux/fs.h>],
129 [posix_lock_file(0,0,0);],
130 [POSIX_LOCK_FILE_WAIT_ARG],
131 [define if your kernel uses 3 arguments for posix_lock_file])
134 AC_DEFUN([LINUX_KERNEL_SOCK_CREATE], [
135 AC_CHECK_LINUX_BUILD([for 5th argument in sock_create found in some SELinux kernels],
136 [ac_cv_linux_kernel_sock_create_v],
137 [#include <linux/net.h>],
138 [sock_create(0,0,0,0,0);],
139 [LINUX_KERNEL_SOCK_CREATE_V],
140 [define if your linux kernel uses 5 arguments for sock_create])
144 AC_DEFUN([LINUX_INODE_SETATTR_RETURN_TYPE], [
145 AC_CHECK_LINUX_BUILD([for inode_setattr return type],
146 [ac_cv_linux_func_inode_setattr_returns_int],
147 [#include <linux/fs.h>],
148 [struct inode _inode;
151 i = inode_setattr(&_inode, &_iattr);],
152 [INODE_SETATTR_NOT_VOID],
153 [define if your setattr return return non-void])
158 AC_DEFUN([LINUX_AOP_WRITEBACK_CONTROL], [
159 AC_CHECK_LINUX_BUILD([whether aop.writepage takes a writeback_control],
160 [ac_cv_linux_func_a_writepage_takes_writeback_control],
161 [#include <linux/fs.h>
162 #include <linux/mm.h>
163 #include <linux/writeback.h>],
164 [struct address_space_operations _aops;
166 struct writeback_control _writeback_control;
167 (void)_aops.writepage(&_page, &_writeback_control);],
168 [AOP_WRITEPAGE_TAKES_WRITEBACK_CONTROL],
169 [define if aops.writepage takes a struct writeback_control])
173 AC_DEFUN([LINUX_REFRIGERATOR], [
174 AC_CHECK_LINUX_BUILD([whether refrigerator takes PF_FREEZE],
175 [ac_cv_linux_func_refrigerator_takes_pf_freeze],
176 [#include <linux/sched.h>
177 #ifdef HAVE_LINUX_FREEZER_H
178 #include <linux/freezer.h>
180 [refrigerator(PF_FREEZE);],
181 [LINUX_REFRIGERATOR_TAKES_PF_FREEZE],
182 [define if your refrigerator takes PF_FREEZE])
186 AC_DEFUN([LINUX_IOP_I_CREATE_TAKES_NAMEIDATA], [
187 AC_CHECK_LINUX_BUILD([whether inode_operations.create takes a nameidata],
188 [ac_cv_linux_func_i_create_takes_nameidata],
189 [#include <linux/fs.h>
190 #include <linux/namei.h>],
191 [struct inode _inode;
192 struct dentry _dentry;
193 struct nameidata _nameidata;
194 (void)_inode.i_op->create(&_inode, &_dentry, 0, &_nameidata);],
196 [IOP_CREATE_TAKES_NAMEIDATA],
197 [define if your iops.create takes a nameidata argument])
201 AC_DEFUN([LINUX_IOP_I_LOOKUP_TAKES_NAMEIDATA], [
202 AC_CHECK_LINUX_BUILD([whether inode_operations.lookup takes a nameidata],
203 [ac_cv_linux_func_i_lookup_takes_nameidata],
204 [#include <linux/fs.h>
205 #include <linux/namei.h>],
206 [struct inode _inode;
207 struct dentry _dentry;
208 struct nameidata _nameidata;
209 (void)_inode.i_op->lookup(&_inode, &_dentry, &_nameidata);],
210 [IOP_LOOKUP_TAKES_NAMEIDATA],
211 [define if your iops.lookup takes a nameidata argument])
215 AC_DEFUN([LINUX_IOP_I_PERMISSION_TAKES_NAMEIDATA], [
216 AC_CHECK_LINUX_BUILD([whether inode_operations.permission takes a nameidata],
217 [ac_cv_linux_func_i_permission_takes_nameidata],
218 [#include <linux/fs.h>
219 #include <linux/namei.h>],
220 [struct inode _inode;
221 struct dentry _dentry;
222 struct nameidata _nameidata;
223 (void)_inode.i_op->permission(&_inode, 0, &_nameidata);],
224 [IOP_PERMISSION_TAKES_NAMEIDATA],
225 [define if your iops.permission takes a nameidata argument])
229 AC_DEFUN([LINUX_IOP_I_PUT_LINK_TAKES_COOKIE], [
230 AC_CHECK_LINUX_BUILD([whether inode_operations.put_link takes an opaque cookie],
231 [ac_cv_linux_func_i_put_link_takes_cookie],
232 [#include <linux/fs.h>
233 #include <linux/namei.h>],
234 [struct inode _inode;
235 struct dentry _dentry;
236 struct nameidata _nameidata;
238 (void)_inode.i_op->put_link(&_dentry, &_nameidata, cookie);],
239 [IOP_PUT_LINK_TAKES_COOKIE],
240 [define if your iops.put_link takes a cookie])
244 AC_DEFUN([LINUX_DOP_D_REVALIDATE_TAKES_NAMEIDATA], [
245 AC_CHECK_LINUX_BUILD([whether dentry_operations.d_revalidate takes a nameidata],
246 [ac_cv_linux_func_d_revalidate_takes_nameidata],
247 [#include <linux/fs.h>
248 #include <linux/namei.h>],
249 [struct dentry _dentry;
250 struct nameidata _nameidata;
251 (void)_dentry.d_op->d_revalidate(&_dentry, &_nameidata);],
252 [DOP_REVALIDATE_TAKES_NAMEIDATA],
253 [define if your dops.d_revalidate takes a nameidata argument])
257 AC_DEFUN([LINUX_GET_SB_HAS_STRUCT_VFSMOUNT], [
258 AC_CHECK_LINUX_BUILD([for struct vfsmount * in get_sb_nodev()],
259 [ac_cv_linux_get_sb_has_struct_vfsmount],
260 [#include <linux/fs.h>],
261 [get_sb_nodev(0,0,0,0,0);],
262 [GET_SB_HAS_STRUCT_VFSMOUNT],
263 [define if your get_sb_nodev needs a struct vfsmount argument])
267 AC_DEFUN([LINUX_STATFS_TAKES_DENTRY], [
268 AC_CHECK_LINUX_BUILD([for dentry in statfs],
269 [ac_cv_linux_statfs_takes_dentry],
270 [#include <linux/fs.h>
271 #include <linux/statfs.h>],
272 [struct super_block _sb;
273 struct dentry _dentry;
274 struct kstatfs _kstatfs;
275 (void)_sb.s_op->statfs(&_dentry, &_kstatfs);],
276 [STATFS_TAKES_DENTRY],
277 [define if your statfs takes a dentry argument])
281 AC_DEFUN([LINUX_LINUX_KEYRING_SUPPORT], [
282 AC_CHECK_LINUX_BUILD([for linux kernel keyring support],
283 [ac_cv_linux_keyring_support],
284 [#include <linux/rwsem.h>
285 #ifdef HAVE_LINUX_KEY_TYPE_H
286 #include <linux/key-type.h>
288 #include <linux/key.h>
289 #include <linux/keyctl.h>],
291 request_key(NULL, NULL, NULL);
292 #if !defined(KEY_POS_VIEW) || !defined(KEY_POS_SEARCH) || !defined(KEY_POS_SETATTR)
293 #error "Your linux/key.h does not contain KEY_POS_VIEW or KEY_POS_SEARCH or KEY_POS_SETATTR"
296 #error rebuild your kernel with CONFIG_KEYS
298 [LINUX_KEYRING_SUPPORT],
299 [define if your kernel has keyring support])
303 AC_DEFUN([LINUX_KEY_ALLOC_NEEDS_STRUCT_TASK], [
304 AC_CACHE_CHECK([if key_alloc() takes a struct task *],
305 [ac_cv_key_alloc_needs_struct_task],
307 save_CPPFLAGS="$CPPFLAGS"
308 CPPFLAGS="$CPPFLAGS -Werror -Wno-pointer-arith"
310 [#include <linux/rwsem.h>
311 #include <linux/key.h>
313 [struct task_struct *t=NULL;
314 (void) key_alloc(NULL, NULL, 0, 0, t, 0, 0);],
315 ac_cv_key_alloc_needs_struct_task=yes,
316 ac_cv_key_alloc_needs_struct_task=no)
317 CPPFLAGS="$save_CPPFLAGS"])
318 AS_IF([test "x$ac_cv_key_alloc_needs_struct_task" = "xyes"],
319 [AC_DEFINE([KEY_ALLOC_NEEDS_STRUCT_TASK], 1,
320 [define if key_alloc takes a struct task *])])
324 AC_DEFUN([LINUX_KEY_ALLOC_NEEDS_CRED], [
325 AC_CACHE_CHECK([if key_alloc() takes credentials],
326 [ac_cv_key_alloc_needs_cred],
328 save_CPPFLAGS="$CPPFLAGS"
329 CPPFLAGS="$CPPFLAGS -Werror -Wno-pointer-arith"
331 [#include <linux/rwsem.h>
332 #include <linux/key.h>],
333 [struct cred *c = NULL;
334 (void) key_alloc(NULL, NULL, 0, 0, c, 0, 0);],
335 ac_cv_key_alloc_needs_cred=yes,
336 ac_cv_key_alloc_needs_cred=no)
337 CPPFLAGS="$save_CPPFLAGS"])
338 AS_IF([test "x$ac_cv_key_alloc_needs_cred" = "xyes"],
339 [AC_DEFINE([KEY_ALLOC_NEEDS_CRED], 1,
340 [define if key_alloc takes credentials])])
344 AC_DEFUN([LINUX_INIT_WORK_HAS_DATA], [
345 AC_CHECK_LINUX_BUILD([whether INIT_WORK has a _data argument],
346 [ac_cv_linux_init_work_has_data],
347 [#include <linux/kernel.h>
348 #include <linux/workqueue.h>],
350 void f(struct work_struct *w) {}
351 struct work_struct *w;
354 [INIT_WORK_HAS_DATA],
355 [define if INIT_WORK takes a data (3rd) argument])
359 AC_DEFUN([LINUX_REGISTER_SYSCTL_TABLE_NOFLAG], [
360 AC_CHECK_LINUX_BUILD([whether register_sysctl_table has an insert_at_head argument],
361 [ac_cv_linux_register_sysctl_table_noflag],
362 [#include <linux/sysctl.h>],
363 [ctl_table *t; register_sysctl_table (t);],
364 [REGISTER_SYSCTL_TABLE_NOFLAG],
365 [define if register_sysctl_table has no insert_at head flag])
369 AC_DEFUN([LINUX_FOP_F_FLUSH_TAKES_FL_OWNER_T], [
370 AC_CHECK_LINUX_BUILD([whether file_operations.flush takes a fl_owner_t],
371 [ac_cv_linux_func_f_flush_takes_fl_owner_t],
372 [#include <linux/fs.h>],
373 [struct inode _inode;
376 (void)_inode.i_fop->flush(&_file, &id);],
377 [FOP_FLUSH_TAKES_FL_OWNER_T],
378 [define if your fops.flush takes an fl_owner_t argument])
382 AC_DEFUN([LINUX_FOP_F_FSYNC_TAKES_DENTRY], [
383 AC_CHECK_LINUX_BUILD([whether file_operations.fsync takes a dentry argument],
384 [ac_cv_linux_func_f_fsync_takes_dentry],
385 [#include <linux/fs.h>],
386 [struct inode _inode;
389 (void)_inode.i_fop->fsync(&_file, &_d, 0);],
390 [FOP_FSYNC_TAKES_DENTRY],
391 [define if your fops.fsync takes an dentry argument])
395 AC_DEFUN([LINUX_HAVE_KMEM_CACHE_T], [
396 AC_CHECK_LINUX_BUILD([whether kmem_cache_t exists],
397 [ac_cv_linux_have_kmem_cache_t],
398 [#include <linux/slab.h>],
401 [define if kmem_cache_t exists])
405 AC_DEFUN([LINUX_KMEM_CACHE_CREATE_TAKES_DTOR], [
406 AC_CHECK_LINUX_BUILD([whether kmem_cache_create takes a destructor argument],
407 [ac_cv_linux_kmem_cache_create_takes_dtor],
408 [#include <linux/slab.h>],
409 [kmem_cache_create(NULL, 0, 0, 0, NULL, NULL);],
410 [KMEM_CACHE_TAKES_DTOR],
411 [define if kmem_cache_create takes a destructor argument])
415 AC_DEFUN([LINUX_KMEM_CACHE_CREATE_CTOR_TAKES_VOID],[
416 AC_CACHE_CHECK([whether kmem_cache_create constructor takes a void pointer],
417 [ac_cv_linux_kmem_cache_create_ctor_takes_void], [
418 save_CPPFLAGS="$CPPFLAGS"
419 CPPFLAGS="$CPPFLAGS -Werror"
420 AC_TRY_KBUILD([#include <linux/slab.h>],
421 [void _ctor(void *v) { }; kmem_cache_create(NULL, 0, 0, 0, _ctor);],
422 ac_cv_linux_kmem_cache_create_ctor_takes_void=yes,
423 ac_cv_linux_kmem_cache_create_ctor_takes_void=no)
424 CPPFLAGS="$save_CPPFLAGS"
426 AS_IF([test "x$ac_cv_linux_kmem_cache_create_ctor_takes_void" = "xyes"],
427 [AC_DEFINE([KMEM_CACHE_CTOR_TAKES_VOID], 1,
428 [define if kmem_cache_create constructor takes a single void ptr])])
432 dnl This function checks not just the existence of the splice functions,
433 dnl but also that the signature matches (they gained an extra argument
435 AC_DEFUN([LINUX_FS_STRUCT_FOP_HAS_SPLICE], [
436 AC_CHECK_LINUX_BUILD([for splice_write and splice_read in struct file_operations],
437 [ac_cv_linux_fs_struct_fop_has_splice],
438 [#include <linux/fs.h>],
439 [struct file_operations _fop;
440 _fop.splice_write(NULL, NULL, NULL, 0, 0);
441 _fop.splice_read(NULL, NULL, NULL, 0, 0);],
442 [STRUCT_FILE_OPERATIONS_HAS_SPLICE],
443 [define if struct file_operations has splice functions])
447 AC_DEFUN([LINUX_KMEM_CACHE_INIT], [
448 AC_CHECK_LINUX_BUILD([for new kmem_cache init function parameters],
449 [ac_cv_linux_kmem_cache_init],
450 [#include <linux/slab.h>],
451 [extern struct kmem_cache *
452 kmem_cache_create(const char *, size_t, size_t,
454 void (*)(struct kmem_cache *, void *));
457 [define for new kmem_cache init function parameters])
461 AC_DEFUN([LINUX_EXPORTS_PROC_ROOT_FS], [
462 AC_CHECK_LINUX_BUILD([if proc_root_fs is defined and exported],
463 [ac_cv_linux_exports_proc_root_fs],
464 [#include <linux/proc_fs.h>],
465 [struct proc_dir_entry *p = proc_root_fs;],
466 [EXPORTED_PROC_ROOT_FS],
467 [define if proc_root_fs is exported])
471 AC_DEFUN([LINUX_D_PATH_TAKES_STRUCT_PATH], [
472 AC_CHECK_LINUX_BUILD([if d_path() takes a struct path argument],
473 [ac_cv_linux_d_path_takes_struct_path],
474 [#include <linux/dcache.h>],
475 [struct path *p; d_path(p, NULL, 0);],
476 [D_PATH_TAKES_STRUCT_PATH],
477 [define if d_path() takes a struct path argument])
481 AC_DEFUN([LINUX_NEW_EXPORT_OPS], [
482 AC_CHECK_LINUX_BUILD([if kernel uses new export ops],
483 [ac_cv_linux_new_export_ops],
484 [#include <linux/exportfs.h>],
485 [struct export_operations _eops;
486 _eops.fh_to_parent(NULL, NULL, 0, 0);],
488 [define if kernel uses new export ops])
492 AC_DEFUN([LINUX_POSIX_TEST_LOCK_RETURNS_CONFLICT], [
493 AC_CHECK_LINUX_BUILD([if posix_test_lock returns a struct file_lock],
494 [ac_cv_linux_posix_test_lock_returns_conflict],
495 [#include <linux/fs.h>],
496 [struct file_lock *lock;
498 lock = posix_test_lock(file, lock);],
499 [POSIX_TEST_LOCK_RETURNS_CONFLICT],
500 [define if posix_test_lock returns the conflicting lock])
504 AC_DEFUN([LINUX_POSIX_TEST_LOCK_CONFLICT_ARG], [
505 AC_CHECK_LINUX_BUILD([if posix_test_lock takes a conflict argument],
506 [ac_cv_linux_posix_test_lock_conflict_arg],
507 [#include <linux/fs.h>],
508 [struct file_lock *lock;
510 posix_test_lock(file, lock, lock);],
511 [POSIX_TEST_LOCK_CONFLICT_ARG],
512 [define if posix_test_lock takes a conflict argument])
516 AC_DEFUN([LINUX_EXPORTS_KEY_TYPE_KEYRING], [
517 AC_CHECK_LINUX_BUILD([for exported key_type_keyring],
518 [ac_cv_linux_exports_key_type_keyring],
520 #ifdef HAVE_LINUX_KEY_TYPE_H
521 #include <linux/key-type.h>
523 #include <linux/key.h>
525 [printk("%s", key_type_keyring.name);],
526 [EXPORTED_KEY_TYPE_KEYRING],
527 [define if key_type_keyring is exported])
531 AC_DEFUN([LINUX_HAVE_TRY_TO_FREEZE], [
532 AC_CHECK_LINUX_BUILD([for try_to_freeze],
533 [ac_cv_linux_have_try_to_freeze],
534 [#include <linux/sched.h>
535 #ifdef HAVE_LINUX_FREEZER_H
536 #include <linux/freezer.h>
538 [#ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE
539 try_to_freeze(PF_FREEZE);
543 [HAVE_TRY_TO_FREEZE],
544 [define if your kernel has the try_to_freeze function])