EXTRA_KCFLAGS="${NO_UNUSED_BUT_SET_VARIABLE}"
ZFS_LINUX_TRY_COMPILE([
#include <linux/blkdev.h>
- ],[
- int (*blk_open) (struct block_device *, fmode_t) = NULL;
- int (*blk_release) (struct gendisk *, fmode_t) = NULL;
- int (*blk_ioctl) (struct block_device *, fmode_t,
- unsigned, unsigned long) = NULL;
- int (*blk_compat_ioctl) (struct block_device *, fmode_t,
- unsigned, unsigned long) = NULL;
- struct block_device_operations blk_ops = {
+
+ int blk_open(struct block_device *bdev, fmode_t mode)
+ { return 0; }
+ int blk_release(struct gendisk *g, fmode_t mode) { return 0; }
+ int blk_ioctl(struct block_device *bdev, fmode_t mode,
+ unsigned x, unsigned long y) { return 0; }
+ int blk_compat_ioctl(struct block_device * bdev, fmode_t mode,
+ unsigned x, unsigned long y) { return 0; }
+
+ static const struct block_device_operations
+ bops __attribute__ ((unused)) = {
.open = blk_open,
.release = blk_release,
.ioctl = blk_ioctl,
.compat_ioctl = blk_compat_ioctl,
};
-
- blk_ops.open(NULL, 0);
- blk_ops.release(NULL, 0);
- blk_ops.ioctl(NULL, 0, 0, 0);
- blk_ops.compat_ioctl(NULL, 0, 0, 0);
+ ],[
],[
AC_MSG_RESULT(struct block_device)
AC_DEFINE(HAVE_BDEV_BLOCK_DEVICE_OPERATIONS, 1,
AC_MSG_CHECKING([whether bio_end_io_t wants 2 args])
ZFS_LINUX_TRY_COMPILE([
#include <linux/bio.h>
- ],[
- void (*wanted_end_io)(struct bio *, int) = NULL;
- bio_end_io_t *local_end_io __attribute__ ((unused));
- local_end_io = wanted_end_io;
+ void wanted_end_io(struct bio *bio, int x) { return; }
+
+ bio_end_io_t *end_io __attribute__ ((unused)) = wanted_end_io;
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_2ARGS_BIO_END_IO_T, 1,
AC_MSG_CHECKING([whether iops->create() takes struct nameidata])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
+
#ifdef HAVE_MKDIR_UMODE_T
- int (*inode_create) (struct inode *,struct dentry *,
- umode_t, struct nameidata *) = NULL;
+ int inode_create(struct inode *inode ,struct dentry *dentry,
+ umode_t umode, struct nameidata *nidata) { return 0; }
#else
- int (*inode_create) (struct inode *,struct dentry *,
- int, struct nameidata *) = NULL;
+ int inode_create(struct inode *inode,struct dentry *dentry,
+ int umode, struct nameidata * nidata) { return 0; }
#endif
- struct inode_operations iops __attribute__ ((unused)) = {
+
+ static const struct inode_operations
+ iops __attribute__ ((unused)) = {
.create = inode_create,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_CREATE_NAMEIDATA, 1,
AC_MSG_CHECKING([whether dops->d_revalidate() takes struct nameidata])
ZFS_LINUX_TRY_COMPILE([
#include <linux/dcache.h>
- ],[
- int (*revalidate) (struct dentry *, struct nameidata *) = NULL;
- struct dentry_operations dops __attribute__ ((unused)) = {
- .d_revalidate = revalidate,
+
+ int revalidate (struct dentry *dentry,
+ struct nameidata *nidata) { return 0; }
+
+ static const struct dentry_operations
+ dops __attribute__ ((unused)) = {
+ .d_revalidate = revalidate,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_D_REVALIDATE_NAMEIDATA, 1,
AC_MSG_CHECKING([whether sops->dirty_inode() wants flags])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- void (*dirty_inode) (struct inode *, int) = NULL;
- struct super_operations sops __attribute__ ((unused));
- sops.dirty_inode = dirty_inode;
+ void dirty_inode(struct inode *a, int b) { return; }
+
+ static const struct super_operations
+ sops __attribute__ ((unused)) = {
+ .dirty_inode = dirty_inode,
+ };
+ ],[
],[
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_DIRTY_INODE_WITH_FLAGS, 1,
AC_MSG_CHECKING([whether fops->fallocate() exists])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- long (*fallocate) (struct file *, int, loff_t, loff_t) = NULL;
- struct file_operations fops __attribute__ ((unused)) = {
- .fallocate = fallocate,
+
+ long test_fallocate(struct file *file, int mode,
+ loff_t offset, loff_t len) { return 0; }
+
+ static const struct file_operations
+ fops __attribute__ ((unused)) = {
+ .fallocate = test_fallocate,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_FILE_FALLOCATE, 1, [fops->fallocate() exists])
AC_MSG_CHECKING([whether iops->fallocate() exists])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- long (*fallocate) (struct inode *, int, loff_t, loff_t) = NULL;
- struct inode_operations fops __attribute__ ((unused)) = {
- .fallocate = fallocate,
- };
- ],[
- AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_INODE_FALLOCATE, 1, [fops->fallocate() exists])
- ],[
- AC_MSG_RESULT(no)
- ])
-])
-dnl #
-dnl # PaX Linux 2.6.38 - 3.x API
-dnl #
-AC_DEFUN([ZFS_AC_PAX_KERNEL_FILE_FALLOCATE], [
- AC_MSG_CHECKING([whether fops->fallocate() exists])
- ZFS_LINUX_TRY_COMPILE([
- #include <linux/fs.h>
- ],[
- long (*fallocate) (struct file *, int, loff_t, loff_t) = NULL;
- struct file_operations_no_const fops __attribute__ ((unused)) = {
- .fallocate = fallocate,
+ long test_fallocate(struct inode *inode, int mode,
+ loff_t offset, loff_t len) { return 0; }
+
+ static const struct inode_operations
+ fops __attribute__ ((unused)) = {
+ .fallocate = test_fallocate,
};
+ ],[
],[
AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_FILE_FALLOCATE, 1, [fops->fallocate() exists])
+ AC_DEFINE(HAVE_INODE_FALLOCATE, 1, [fops->fallocate() exists])
],[
AC_MSG_RESULT(no)
])
AC_DEFUN([ZFS_AC_KERNEL_FALLOCATE], [
ZFS_AC_KERNEL_FILE_FALLOCATE
ZFS_AC_KERNEL_INODE_FALLOCATE
- ZFS_AC_PAX_KERNEL_FILE_FALLOCATE
])
AC_DEFUN([ZFS_AC_KERNEL_FSYNC_WITH_DENTRY], [
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- int (*fsync) (struct file *, struct dentry *, int) = NULL;
- struct file_operations fops __attribute__ ((unused));
- fops.fsync = fsync;
+ int test_fsync(struct file *f, struct dentry *dentry, int x)
+ { return 0; }
+
+ static const struct file_operations
+ fops __attribute__ ((unused)) = {
+ .fsync = test_fsync,
+ };
+ ],[
],[
AC_MSG_RESULT([dentry])
AC_DEFINE(HAVE_FSYNC_WITH_DENTRY, 1,
AC_DEFUN([ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY], [
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- int (*fsync) (struct file *, int) = NULL;
- struct file_operations fops __attribute__ ((unused));
- fops.fsync = fsync;
+ int test_fsync(struct file *f, int x) { return 0; }
+
+ static const struct file_operations
+ fops __attribute__ ((unused)) = {
+ .fsync = test_fsync,
+ };
+ ],[
],[
AC_MSG_RESULT([no dentry])
AC_DEFINE(HAVE_FSYNC_WITHOUT_DENTRY, 1,
AC_DEFUN([ZFS_AC_KERNEL_FSYNC_RANGE], [
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- int (*fsync) (struct file *, loff_t, loff_t, int) = NULL;
- struct file_operations fops __attribute__ ((unused));
-
- fops.fsync = fsync;
- ],[
- AC_MSG_RESULT([range])
- AC_DEFINE(HAVE_FSYNC_RANGE, 1,
- [fops->fsync() with range])
- ],[
- ])
-])
-dnl #
-dnl # PaX Linux 2.6.x - 2.6.34 API
-dnl #
-AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_WITH_DENTRY], [
- ZFS_LINUX_TRY_COMPILE([
- #include <linux/fs.h>
- ],[
- int (*fsync) (struct file *, struct dentry *, int) = NULL;
- file_operations_no_const fops __attribute__ ((unused));
+ int test_fsync(struct file *f, loff_t a, loff_t b, int c)
+ { return 0; }
- fops.fsync = fsync;
- ],[
- AC_MSG_RESULT([dentry])
- AC_DEFINE(HAVE_FSYNC_WITH_DENTRY, 1,
- [fops->fsync() with dentry])
+ static const struct file_operations
+ fops __attribute__ ((unused)) = {
+ .fsync = test_fsync,
+ };
],[
- ])
-])
-
-dnl #
-dnl # PaX Linux 2.6.35 - Linux 3.0 API
-dnl #
-AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_WITHOUT_DENTRY], [
- ZFS_LINUX_TRY_COMPILE([
- #include <linux/fs.h>
- ],[
- int (*fsync) (struct file *, int) = NULL;
- file_operations_no_const fops __attribute__ ((unused));
-
- fops.fsync = fsync;
- ],[
- AC_MSG_RESULT([no dentry])
- AC_DEFINE(HAVE_FSYNC_WITHOUT_DENTRY, 1,
- [fops->fsync() without dentry])
- ],[
- ])
-])
-
-dnl #
-dnl # PaX Linux 3.1 - 3.x API
-dnl #
-AC_DEFUN([ZFS_AC_PAX_KERNEL_FSYNC_RANGE], [
- ZFS_LINUX_TRY_COMPILE([
- #include <linux/fs.h>
- ],[
- int (*fsync) (struct file *, loff_t, loff_t, int) = NULL;
- file_operations_no_const fops __attribute__ ((unused));
-
- fops.fsync = fsync;
],[
AC_MSG_RESULT([range])
AC_DEFINE(HAVE_FSYNC_RANGE, 1,
ZFS_AC_KERNEL_FSYNC_WITH_DENTRY
ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY
ZFS_AC_KERNEL_FSYNC_RANGE
- ZFS_AC_PAX_KERNEL_FSYNC_WITH_DENTRY
- ZFS_AC_PAX_KERNEL_FSYNC_WITHOUT_DENTRY
- ZFS_AC_PAX_KERNEL_FSYNC_RANGE
])
AC_MSG_CHECKING([whether iops->lookup() takes struct nameidata])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- struct dentry * (*inode_lookup) (struct inode *,struct dentry *,
- struct nameidata *) = NULL;
- struct inode_operations iops __attribute__ ((unused)) = {
- .lookup = inode_lookup,
+
+ struct dentry *inode_lookup(struct inode *inode,
+ struct dentry *dentry, struct nameidata *nidata)
+ { return NULL; }
+
+ static const struct inode_operations iops
+ __attribute__ ((unused)) = {
+ .lookup = inode_lookup,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_LOOKUP_NAMEIDATA, 1,
AC_MSG_CHECKING([whether iops->create()/mkdir()/mknod() take umode_t])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- int (*mkdir) (struct inode *,struct dentry *,umode_t) = NULL;
- struct inode_operations iops __attribute__ ((unused)) = {
+
+ int mkdir(struct inode *inode, struct dentry *dentry,
+ umode_t umode) { return 0; }
+
+ static const struct inode_operations
+ iops __attribute__ ((unused)) = {
.mkdir = mkdir,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_MKDIR_UMODE_T, 1,
AC_MSG_CHECKING([whether super_block has s_shrink])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- int (*shrink)(struct shrinker *, struct shrink_control *sc)
- __attribute__ ((unused)) = NULL;
- struct super_block sb __attribute__ ((unused)) = {
+
+ int shrink(struct shrinker *s, struct shrink_control *sc)
+ { return 0; }
+
+ static const struct super_block
+ sb __attribute__ ((unused)) = {
.s_shrink.shrink = shrink,
.s_shrink.seeks = DEFAULT_SEEKS,
.s_shrink.batch = 0,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_SHRINK, 1, [struct super_block has s_shrink])
AC_MSG_CHECKING([whether sops->nr_cached_objects() exists])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- int (*nr_cached_objects)(struct super_block *)
- __attribute__ ((unused)) = NULL;
- struct super_operations sops __attribute__ ((unused)) = {
+
+ int nr_cached_objects(struct super_block *sb) { return 0; }
+
+ static const struct super_operations
+ sops __attribute__ ((unused)) = {
.nr_cached_objects = nr_cached_objects,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_NR_CACHED_OBJECTS, 1,
AC_MSG_CHECKING([whether sops->free_cached_objects() exists])
ZFS_LINUX_TRY_COMPILE([
#include <linux/fs.h>
- ],[
- void (*free_cached_objects)(struct super_block *, int)
- __attribute__ ((unused)) = NULL;
- struct super_operations sops __attribute__ ((unused)) = {
+
+ void free_cached_objects(struct super_block *sb, int x)
+ { return; }
+
+ static const struct super_operations
+ sops __attribute__ ((unused)) = {
.free_cached_objects = free_cached_objects,
};
+ ],[
],[
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_FREE_CACHED_OBJECTS, 1,