diff options
author | Brian Behlendorf <[email protected]> | 2018-05-02 15:01:24 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2018-05-02 15:01:24 -0700 |
commit | 9464b9591ea5cd61a4d6ef8e29c4597b48d16a77 (patch) | |
tree | 549b75c9d264a4b1da403268ccbb49f20e4ef4e6 /module/zfs/zpl_file.c | |
parent | bc8a6a60e9f0fd219e10f355384d87a41d4f5882 (diff) |
RHEL 7.5 compat: FMODE_KABI_ITERATE
As of RHEL 7.5 the mainline fops.iterate() method was added to
the file_operations structure and is correctly detected by the
configure script.
Normally this is what we want, but in order to maintain KABI
compatibility the RHEL change additionally does the following:
* Requires that callers intending to use this extended interface
set the FMODE_KABI_ITERATE flag on the file structure when
opening the directory.
* Adds the fops.iterate() method to the end of the structure,
without removing fops.readdir().
This change updates the configure check to ignore the RHEL 7.5+
variant of fops.iterate() when detected. Instead fallback to
the fops.readdir() interface which will be available.
Finally, add the 'zpl_' prefix to the directory context wrappers
to avoid colliding with the kernel provided symbols when both
the fops.iterate() and fops.readdir() are provided by the kernel.
Reviewed-by: Olaf Faaland <[email protected]>
Reviewed-by: Tony Hutter <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #7460
Closes #7463
Diffstat (limited to 'module/zfs/zpl_file.c')
-rw-r--r-- | module/zfs/zpl_file.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/module/zfs/zpl_file.c b/module/zfs/zpl_file.c index 1c5f5e409..e03a0481c 100644 --- a/module/zfs/zpl_file.c +++ b/module/zfs/zpl_file.c @@ -76,7 +76,7 @@ zpl_release(struct inode *ip, struct file *filp) } static int -zpl_iterate(struct file *filp, struct dir_context *ctx) +zpl_iterate(struct file *filp, zpl_dir_context_t *ctx) { cred_t *cr = CRED(); int error; @@ -96,7 +96,8 @@ zpl_iterate(struct file *filp, struct dir_context *ctx) static int zpl_readdir(struct file *filp, void *dirent, filldir_t filldir) { - struct dir_context ctx = DIR_CONTEXT_INIT(dirent, filldir, filp->f_pos); + zpl_dir_context_t ctx = + ZPL_DIR_CONTEXT_INIT(dirent, filldir, filp->f_pos); int error; error = zpl_iterate(filp, &ctx); @@ -104,7 +105,7 @@ zpl_readdir(struct file *filp, void *dirent, filldir_t filldir) return (error); } -#endif /* HAVE_VFS_ITERATE */ +#endif /* !HAVE_VFS_ITERATE && !HAVE_VFS_ITERATE_SHARED */ #if defined(HAVE_FSYNC_WITH_DENTRY) /* @@ -965,7 +966,7 @@ const struct file_operations zpl_file_operations = { const struct file_operations zpl_dir_file_operations = { .llseek = generic_file_llseek, .read = generic_read_dir, -#ifdef HAVE_VFS_ITERATE_SHARED +#if defined(HAVE_VFS_ITERATE_SHARED) .iterate_shared = zpl_iterate, #elif defined(HAVE_VFS_ITERATE) .iterate = zpl_iterate, |