summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/kernel-acl.m416
-rw-r--r--include/linux/vfs_compat.h11
-rw-r--r--module/zfs/zpl_xattr.c4
3 files changed, 26 insertions, 5 deletions
diff --git a/config/kernel-acl.m4 b/config/kernel-acl.m4
index e9a254780..a03ee5bff 100644
--- a/config/kernel-acl.m4
+++ b/config/kernel-acl.m4
@@ -44,6 +44,9 @@ dnl # 3.1 API change,
dnl # posix_acl_chmod_masq() is not exported anymore and posix_acl_chmod()
dnl # was introduced to replace it.
dnl #
+dnl # 3.14 API change,
+dnl # posix_acl_chmod() is changed to __posix_acl_chmod()
+dnl #
AC_DEFUN([ZFS_AC_KERNEL_POSIX_ACL_CHMOD], [
AC_MSG_CHECKING([whether posix_acl_chmod exists])
ZFS_LINUX_TRY_COMPILE([
@@ -57,6 +60,19 @@ AC_DEFUN([ZFS_AC_KERNEL_POSIX_ACL_CHMOD], [
],[
AC_MSG_RESULT(no)
])
+
+ AC_MSG_CHECKING([whether __posix_acl_chmod exists])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ #include <linux/posix_acl.h>
+ ],[
+ __posix_acl_chmod(NULL, 0, 0)
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE___POSIX_ACL_CHMOD, 1, [__posix_acl_chmod() exists])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
])
dnl #
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
index 4778491fa..4358cd288 100644
--- a/include/linux/vfs_compat.h
+++ b/include/linux/vfs_compat.h
@@ -263,9 +263,13 @@ zpl_forget_cached_acl(struct inode *ip, int type) {
#define zpl_inode_owner_or_capable(ip) is_owner_or_cap(ip)
#endif /* HAVE_INODE_OWNER_OR_CAPABLE */
-#ifndef HAVE_POSIX_ACL_CHMOD
+#ifndef HAVE___POSIX_ACL_CHMOD
+#ifdef HAVE_POSIX_ACL_CHMOD
+#define __posix_acl_chmod(acl, gfp, mode) posix_acl_chmod(acl, gfp, mode)
+#define __posix_acl_create(acl, gfp, mode) posix_acl_create(acl, gfp, mode)
+#else
static inline int
-posix_acl_chmod(struct posix_acl **acl, int flags, umode_t umode) {
+__posix_acl_chmod(struct posix_acl **acl, int flags, umode_t umode) {
struct posix_acl *oldacl = *acl;
mode_t mode = umode;
int error;
@@ -286,7 +290,7 @@ posix_acl_chmod(struct posix_acl **acl, int flags, umode_t umode) {
}
static inline int
-posix_acl_create(struct posix_acl **acl, int flags, umode_t *umodep) {
+__posix_acl_create(struct posix_acl **acl, int flags, umode_t *umodep) {
struct posix_acl *oldacl = *acl;
mode_t mode = *umodep;
int error;
@@ -308,6 +312,7 @@ posix_acl_create(struct posix_acl **acl, int flags, umode_t *umodep) {
return (error);
}
#endif /* HAVE_POSIX_ACL_CHMOD */
+#endif /* HAVE___POSIX_ACL_CHMOD */
#ifndef HAVE_CURRENT_UMASK
static inline int
diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c
index 9334ae7d1..c5c15a2dd 100644
--- a/module/zfs/zpl_xattr.c
+++ b/module/zfs/zpl_xattr.c
@@ -924,7 +924,7 @@ zpl_init_acl(struct inode *ip, struct inode *dir)
}
mode = ip->i_mode;
- error = posix_acl_create(&acl, GFP_KERNEL, &mode);
+ error = __posix_acl_create(&acl, GFP_KERNEL, &mode);
if (error >= 0) {
ip->i_mode = mode;
mark_inode_dirty(ip);
@@ -954,7 +954,7 @@ zpl_chmod_acl(struct inode *ip)
if (IS_ERR(acl) || !acl)
return (PTR_ERR(acl));
- error = posix_acl_chmod(&acl, GFP_KERNEL, ip->i_mode);
+ error = __posix_acl_chmod(&acl, GFP_KERNEL, ip->i_mode);
if (!error)
error = zpl_set_acl(ip, ACL_TYPE_ACCESS, acl);