summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/kernel-aio-fsync.m421
-rw-r--r--config/kernel.m41
-rw-r--r--module/zfs/zpl_file.c11
3 files changed, 33 insertions, 0 deletions
diff --git a/config/kernel-aio-fsync.m4 b/config/kernel-aio-fsync.m4
new file mode 100644
index 000000000..41b7a98a6
--- /dev/null
+++ b/config/kernel-aio-fsync.m4
@@ -0,0 +1,21 @@
+dnl #
+dnl # Linux 4.9-rc5+ ABI, removal of the .aio_fsync field
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_AIO_FSYNC], [
+ AC_MSG_CHECKING([whether fops->aio_fsync() exists])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+
+ static const struct file_operations
+ fops __attribute__ ((unused)) = {
+ .aio_fsync = NULL,
+ };
+ ],[
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_FILE_AIO_FSYNC, 1, [fops->aio_fsync() exists])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+])
+
diff --git a/config/kernel.m4 b/config/kernel.m4
index af5945140..b66631a9c 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -66,6 +66,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
ZFS_AC_KERNEL_NR_CACHED_OBJECTS
ZFS_AC_KERNEL_FREE_CACHED_OBJECTS
ZFS_AC_KERNEL_FALLOCATE
+ ZFS_AC_KERNEL_AIO_FSYNC
ZFS_AC_KERNEL_MKDIR_UMODE_T
ZFS_AC_KERNEL_LOOKUP_NAMEIDATA
ZFS_AC_KERNEL_CREATE_NAMEIDATA
diff --git a/module/zfs/zpl_file.c b/module/zfs/zpl_file.c
index 2c84d700d..a22522028 100644
--- a/module/zfs/zpl_file.c
+++ b/module/zfs/zpl_file.c
@@ -130,12 +130,15 @@ zpl_fsync(struct file *filp, struct dentry *dentry, int datasync)
return (error);
}
+#ifdef HAVE_FILE_AIO_FSYNC
static int
zpl_aio_fsync(struct kiocb *kiocb, int datasync)
{
struct file *filp = kiocb->ki_filp;
return (zpl_fsync(filp, file_dentry(filp), datasync));
}
+#endif
+
#elif defined(HAVE_FSYNC_WITHOUT_DENTRY)
/*
* Linux 2.6.35 - 3.0 API,
@@ -161,11 +164,14 @@ zpl_fsync(struct file *filp, int datasync)
return (error);
}
+#ifdef HAVE_FILE_AIO_FSYNC
static int
zpl_aio_fsync(struct kiocb *kiocb, int datasync)
{
return (zpl_fsync(kiocb->ki_filp, datasync));
}
+#endif
+
#elif defined(HAVE_FSYNC_RANGE)
/*
* Linux 3.1 - 3.x API,
@@ -196,11 +202,14 @@ zpl_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
return (error);
}
+#ifdef HAVE_FILE_AIO_FSYNC
static int
zpl_aio_fsync(struct kiocb *kiocb, int datasync)
{
return (zpl_fsync(kiocb->ki_filp, kiocb->ki_pos, -1, datasync));
}
+#endif
+
#else
#error "Unsupported fops->fsync() implementation"
#endif
@@ -838,7 +847,9 @@ const struct file_operations zpl_file_operations = {
#endif
.mmap = zpl_mmap,
.fsync = zpl_fsync,
+#ifdef HAVE_FILE_AIO_FSYNC
.aio_fsync = zpl_aio_fsync,
+#endif
#ifdef HAVE_FILE_FALLOCATE
.fallocate = zpl_fallocate,
#endif /* HAVE_FILE_FALLOCATE */