diff options
author | Chunwei Chen <[email protected]> | 2016-05-18 14:30:20 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-05-20 11:09:16 -0700 |
commit | 9baaa7deae45c8556dfd79b2011234da5cb37b3a (patch) | |
tree | 604c0db0b143616bec811b4c3e724a97effa3333 /config | |
parent | e42d46664e81136f3e9b7030fe77f0550e615c3f (diff) |
Linux 4.7 compat: use iterate_shared for concurrent readdir
Register iterate_shared if it exists so the kernel will used shared
lock and allowing concurrent readdir.
Also, use shared lock when doing llseek with SEEK_DATA or SEEK_HOLE
to allow concurrent seeking.
Signed-off-by: Chunwei Chen <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #4664
Closes #4665
Diffstat (limited to 'config')
-rw-r--r-- | config/kernel-vfs-iterate.m4 | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/config/kernel-vfs-iterate.m4 b/config/kernel-vfs-iterate.m4 index c2c65622c..7b1599e13 100644 --- a/config/kernel-vfs-iterate.m4 +++ b/config/kernel-vfs-iterate.m4 @@ -1,8 +1,8 @@ -dnl # -dnl # 3.11 API change -dnl # AC_DEFUN([ZFS_AC_KERNEL_VFS_ITERATE], [ - AC_MSG_CHECKING([whether fops->iterate() is available]) + dnl # + dnl # 4.7 API change + dnl # + AC_MSG_CHECKING([whether fops->iterate_shared() is available]) ZFS_LINUX_TRY_COMPILE([ #include <linux/fs.h> int iterate(struct file *filp, struct dir_context * context) @@ -10,34 +10,55 @@ AC_DEFUN([ZFS_AC_KERNEL_VFS_ITERATE], [ static const struct file_operations fops __attribute__ ((unused)) = { - .iterate = iterate, + .iterate_shared = iterate, }; ],[ ],[ AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_VFS_ITERATE, 1, - [fops->iterate() is available]) + AC_DEFINE(HAVE_VFS_ITERATE_SHARED, 1, + [fops->iterate_shared() is available]) ],[ AC_MSG_RESULT(no) - AC_MSG_CHECKING([whether fops->readdir() is available]) + dnl # + dnl # 3.11 API change + dnl # + AC_MSG_CHECKING([whether fops->iterate() is available]) ZFS_LINUX_TRY_COMPILE([ #include <linux/fs.h> - int readdir(struct file *filp, void *entry, filldir_t func) + int iterate(struct file *filp, struct dir_context * context) { return 0; } static const struct file_operations fops __attribute__ ((unused)) = { - .readdir = readdir, + .iterate = iterate, }; ],[ ],[ AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_VFS_READDIR, 1, - [fops->readdir() is available]) + AC_DEFINE(HAVE_VFS_ITERATE, 1, + [fops->iterate() is available]) ],[ - AC_MSG_ERROR(no; file a bug report with ZFSOnLinux) - ]) + AC_MSG_RESULT(no) + + AC_MSG_CHECKING([whether fops->readdir() is available]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> + int readdir(struct file *filp, void *entry, filldir_t func) + { return 0; } + static const struct file_operations fops + __attribute__ ((unused)) = { + .readdir = readdir, + }; + ],[ + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_VFS_READDIR, 1, + [fops->readdir() is available]) + ],[ + AC_MSG_ERROR(no; file a bug report with ZFSOnLinux) + ]) + ]) ]) ]) |