summaryrefslogtreecommitdiffstats
path: root/config/kernel-get-link.m4
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2016-01-14 13:25:10 -0500
committerBrian Behlendorf <[email protected]>2016-01-20 11:36:00 -0800
commitbeeed4596b192f879fbb13e656cc6458ccde1193 (patch)
tree83fbf5e22dc10bccbd9034e9b16c787cbe4e23b8 /config/kernel-get-link.m4
parentbc89ac8479c0b265c539b579fda2bef1997d423c (diff)
Linux 4.5 compat: get_link() / put_link()
The follow_link() interface was retired in favor of get_link(). In the process of phasing in get_link() the Linux kernel went through two different versions. The first of which depended on put_link() and the final version on a delayed done function. - Improved configure checks for .follow_link, .get_link, .put_link. - Interfaces checked from newest to oldest. - Strict checking for each possible known interface. - Configure fails when no known interface is available. - Both versions .get_link are detected and supported as well two previous versions of .follow_link. Signed-off-by: Brian Behlendorf <[email protected]> Signed-off-by: Tim Chase <[email protected]> Signed-off-by: Chunwei Chen <[email protected]> Issue #4228
Diffstat (limited to 'config/kernel-get-link.m4')
-rw-r--r--config/kernel-get-link.m4100
1 files changed, 100 insertions, 0 deletions
diff --git a/config/kernel-get-link.m4 b/config/kernel-get-link.m4
new file mode 100644
index 000000000..022c49c54
--- /dev/null
+++ b/config/kernel-get-link.m4
@@ -0,0 +1,100 @@
+dnl #
+dnl # Supported get_link() interfaces checked newest to oldest.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_FOLLOW_LINK], [
+ dnl #
+ dnl # 4.2 API change
+ dnl # - This kernel retired the nameidata structure.
+ dnl #
+ AC_MSG_CHECKING([whether iops->follow_link() passes cookie])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ const char *follow_link(struct dentry *de,
+ void **cookie) { return "symlink"; }
+ static struct inode_operations
+ iops __attribute__ ((unused)) = {
+ .follow_link = follow_link,
+ };
+ ],[
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_FOLLOW_LINK_COOKIE, 1,
+ [iops->follow_link() cookie])
+ ],[
+ dnl #
+ dnl # 2.6.32 API
+ dnl #
+ AC_MSG_RESULT(no)
+ AC_MSG_CHECKING(
+ [whether iops->follow_link() passes nameidata])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ void *follow_link(struct dentry *de, struct
+ nameidata *nd) { return (void *)NULL; }
+ static struct inode_operations
+ iops __attribute__ ((unused)) = {
+ .follow_link = follow_link,
+ };
+ ],[
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_FOLLOW_LINK_NAMEIDATA, 1,
+ [iops->follow_link() nameidata])
+ ],[
+ AC_MSG_ERROR(no; please file a bug report)
+ ])
+ ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_GET_LINK], [
+ dnl #
+ dnl # 4.5 API change
+ dnl # The get_link interface has added a delayed done call and
+ dnl # used it to retire the put_link() interface.
+ dnl #
+ AC_MSG_CHECKING([whether iops->get_link() passes delayed])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ const char *get_link(struct dentry *de, struct inode *ip,
+ struct delayed_call *done) { return "symlink"; }
+ static struct inode_operations
+ iops __attribute__ ((unused)) = {
+ .get_link = get_link,
+ };
+ ],[
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_GET_LINK_DELAYED, 1,
+ [iops->get_link() delayed])
+ ],[
+ dnl #
+ dnl # 4.5 API change
+ dnl # The follow_link() interface has been replaced by
+ dnl # get_link() which behaves the same as before except:
+ dnl # - An inode is passed as a separate argument
+ dnl # - When called in RCU mode a NULL dentry is passed.
+ dnl #
+ AC_MSG_RESULT(no)
+ AC_MSG_CHECKING([whether iops->get_link() passes cookie])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ const char *get_link(struct dentry *de, struct
+ inode *ip, void **cookie) { return "symlink"; }
+ static struct inode_operations
+ iops __attribute__ ((unused)) = {
+ .get_link = get_link,
+ };
+ ],[
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_GET_LINK_COOKIE, 1,
+ [iops->get_link() cookie])
+ ],[
+ dnl #
+ dnl # Check for the follow_link APIs.
+ dnl #
+ AC_MSG_RESULT(no)
+ ZFS_AC_KERNEL_FOLLOW_LINK
+ ])
+ ])
+])