diff options
author | Richard Yao <[email protected]> | 2013-08-07 08:53:45 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2013-08-15 16:19:07 -0700 |
commit | 0f37d0c8bed442dd0d2c1b1dddd68653fa6eec66 (patch) | |
tree | bbd56b426b2b72bed0e3f81afaab2ddf5e613e3e /config | |
parent | 34e143323e359b42bc9d06dd19cc4b1f13091283 (diff) |
Linux 3.11 compat: fops->iterate()
Commit torvalds/linux@2233f31aade393641f0eaed43a71110e629bb900
replaced ->readdir() with ->iterate() in struct file_operations.
All filesystems must now use the new ->iterate method.
To handle this the code was reworked to use the new ->iterate
interface. Care was taken to keep the majority of changes
confined to the ZPL layer which is already Linux specific.
However, minor changes were required to the common zfs_readdir()
function.
Compatibility with older kernels was accomplished by adding
versions of the trivial dir_emit* helper functions. Also the
various *_readdir() functions were reworked in to wrappers
which create a dir_context structure to pass to the new
*_iterate() functions.
Unfortunately, the new dir_emit* functions prevent us from
passing a private pointer to the filldir function. The xattr
directory code leveraged this ability through zfs_readdir()
to generate the list of xattr names. Since we can no longer
use zfs_readdir() a simplified zpl_xattr_readdir() function
was added to perform the same task.
Signed-off-by: Richard Yao <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #1653
Issue #1591
Diffstat (limited to 'config')
-rw-r--r-- | config/kernel-vfs-iterate.m4 | 43 | ||||
-rw-r--r-- | config/kernel.m4 | 1 |
2 files changed, 44 insertions, 0 deletions
diff --git a/config/kernel-vfs-iterate.m4 b/config/kernel-vfs-iterate.m4 new file mode 100644 index 000000000..c2c65622c --- /dev/null +++ b/config/kernel-vfs-iterate.m4 @@ -0,0 +1,43 @@ +dnl # +dnl # 3.11 API change +dnl # +AC_DEFUN([ZFS_AC_KERNEL_VFS_ITERATE], [ + AC_MSG_CHECKING([whether fops->iterate() is available]) + ZFS_LINUX_TRY_COMPILE([ + #include <linux/fs.h> + int iterate(struct file *filp, struct dir_context * context) + { return 0; } + + static const struct file_operations fops + __attribute__ ((unused)) = { + .iterate = iterate, + }; + ],[ + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_VFS_ITERATE, 1, + [fops->iterate() is available]) + ],[ + 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) + ]) + + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index 8742bc51f..74ce22ce6 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -80,6 +80,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_ELEVATOR_CHANGE ZFS_AC_KERNEL_5ARG_SGET ZFS_AC_KERNEL_LSEEK_EXECUTE + ZFS_AC_KERNEL_VFS_ITERATE AS_IF([test "$LINUX_OBJ" != "$LINUX"], [ KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ" |