-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
- Loading branch information
1 parent
bc89ac8
commit beeed45
Showing
6 changed files
with
253 additions
and
81 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
]) | ||
]) | ||
]) |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
dnl # | ||
dnl # Supported symlink APIs | ||
dnl # | ||
AC_DEFUN([ZFS_AC_KERNEL_PUT_LINK], [ | ||
dnl # | ||
dnl # 4.5 API change | ||
dnl # get_link() uses delayed done, there is no put_link() interface. | ||
dnl # | ||
ZFS_LINUX_TRY_COMPILE([ | ||
#if !defined(HAVE_GET_LINK_DELAYED) | ||
#error "Expecting get_link() delayed done" | ||
#endif | ||
],[ | ||
],[ | ||
AC_DEFINE(HAVE_PUT_LINK_DELAYED, 1, [iops->put_link() delayed]) | ||
],[ | ||
dnl # | ||
dnl # 4.2 API change | ||
dnl # This kernel retired the nameidata structure. | ||
dnl # | ||
AC_MSG_CHECKING([whether iops->put_link() passes cookie]) | ||
ZFS_LINUX_TRY_COMPILE([ | ||
#include <linux/fs.h> | ||
void put_link(struct inode *ip, void *cookie) | ||
{ return; } | ||
static struct inode_operations | ||
iops __attribute__ ((unused)) = { | ||
.put_link = put_link, | ||
}; | ||
],[ | ||
],[ | ||
AC_MSG_RESULT(yes) | ||
AC_DEFINE(HAVE_PUT_LINK_COOKIE, 1, | ||
[iops->put_link() cookie]) | ||
],[ | ||
dnl # | ||
dnl # 2.6.32 API | ||
dnl # | ||
AC_MSG_RESULT(no) | ||
AC_MSG_CHECKING( | ||
[whether iops->put_link() passes nameidata]) | ||
ZFS_LINUX_TRY_COMPILE([ | ||
#include <linux/fs.h> | ||
void put_link(struct dentry *de, struct | ||
nameidata *nd, void *ptr) { return; } | ||
static struct inode_operations | ||
iops __attribute__ ((unused)) = { | ||
.put_link = put_link, | ||
}; | ||
],[ | ||
],[ | ||
AC_MSG_RESULT(yes) | ||
AC_DEFINE(HAVE_PUT_LINK_NAMEIDATA, 1, | ||
[iops->put_link() nameidata]) | ||
],[ | ||
AC_MSG_ERROR(no; please file a bug report) | ||
]) | ||
]) | ||
]) | ||
]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters