diff options
author | Brian Behlendorf <[email protected]> | 2011-11-09 20:47:59 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2011-11-10 10:03:08 -0800 |
commit | adcd70bd1af405464d6dbc6b2057594cddda7a24 (patch) | |
tree | 8adac7dcb42c19e1f9cd82f3a1d34af54f565217 /config/kernel-fsync.m4 | |
parent | 8c19f5b407132b7ee1d6b7dc7c763f2ae80be976 (diff) |
Linux 3.1 compat, fops->fsync()
The Linux 3.1 kernel updated the fops->fsync() callback yet again.
They now pass the requested range and delegate the responsibility
for calling filemap_write_and_wait_range() to the callback. In
addition imutex is no longer held by the caller and the callback
is responsible for taking the lock if required.
This commit updates the code to provide a zpl_fsync() function
for the updated API. Implementations for the previous two APIs
are also maintained for compatibility.
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #445
Diffstat (limited to 'config/kernel-fsync.m4')
-rw-r--r-- | config/kernel-fsync.m4 | 59 |
1 files changed, 51 insertions, 8 deletions
diff --git a/config/kernel-fsync.m4 b/config/kernel-fsync.m4 index 3f938426b..862b89782 100644 --- a/config/kernel-fsync.m4 +++ b/config/kernel-fsync.m4 @@ -1,20 +1,63 @@ dnl # -dnl # 2.6.35 API change -dnl # The dentry argument was deamed unused and dropped in 2.6.36. +dnl # Linux 2.6.x - 2.6.34 API dnl # -AC_DEFUN([ZFS_AC_KERNEL_FSYNC_2ARGS], [ - AC_MSG_CHECKING([whether fops->fsync() wants 2 args]) +AC_DEFUN([ZFS_AC_KERNEL_FSYNC_WITH_DENTRY], [ ZFS_LINUX_TRY_COMPILE([ #include <linux/fs.h> ],[ - int (*fsync) (struct file *, int datasync) = NULL; + int (*fsync) (struct file *, struct dentry *, int) = NULL; struct file_operations fops __attribute__ ((unused)); fops.fsync = fsync; ],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_2ARGS_FSYNC, 1, [fops->fsync() want 2 args]) + AC_MSG_RESULT([dentry]) + AC_DEFINE(HAVE_FSYNC_WITH_DENTRY, 1, + [fops->fsync() with dentry]) ],[ - AC_MSG_RESULT(no) ]) ]) + +dnl # +dnl # Linux 2.6.35 - Linux 3.0 API +dnl # +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; + ],[ + AC_MSG_RESULT([no dentry]) + AC_DEFINE(HAVE_FSYNC_WITHOUT_DENTRY, 1, + [fops->fsync() without dentry]) + ],[ + ]) +]) + +dnl # +dnl # Linux 3.1 -x 3.x API +dnl # +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]) + ],[ + ]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_FSYNC], [ + AC_MSG_CHECKING([whether fops->fsync() wants]) + ZFS_AC_KERNEL_FSYNC_WITH_DENTRY + ZFS_AC_KERNEL_FSYNC_WITHOUT_DENTRY + ZFS_AC_KERNEL_FSYNC_RANGE +]) |