aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs
diff options
context:
space:
mode:
authorChunwei Chen <[email protected]>2016-08-08 17:26:21 -0700
committerBrian Behlendorf <[email protected]>2016-08-09 10:03:04 -0700
commitafb6c031e87d511abd9f0f4ec629ab1972490269 (patch)
tree830fd62e1b69d8f82bbfa14f635299f55be430d1 /module/zfs
parent88c4c7a0671afef9016446e0132ba86622929092 (diff)
Linux 4.7 compat: fix zpl_get_acl returns invalid acl pointer
Starting from Linux 4.7, get_acl will set acl cache pointer to temporary sentinel value before calling i_op->get_acl. Therefore we can't compare against ACL_NOT_CACHED and return. Since from Linux 3.14, get_acl already check the cache for us, so we disable this in zpl_get_acl. Linux 4.7 also does set_cached_acl for us so we disable it in zpl_get_acl. Signed-off-by: Chunwei Chen <[email protected]> Signed-off-by: Nikolay Borisov <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #4944 Closes #4946
Diffstat (limited to 'module/zfs')
-rw-r--r--module/zfs/zpl_xattr.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c
index ab81dd2d0..471cb16c6 100644
--- a/module/zfs/zpl_xattr.c
+++ b/module/zfs/zpl_xattr.c
@@ -1017,9 +1017,16 @@ zpl_get_acl(struct inode *ip, int type)
char *name;
int size;
+ /*
+ * As of Linux 3.14, the kernel get_acl will check this for us.
+ * Also as of Linux 4.7, comparing against ACL_NOT_CACHED is wrong
+ * as the kernel get_acl will set it to temporary sentinel value.
+ */
+#ifndef HAVE_KERNEL_GET_ACL_HANDLE_CACHE
acl = get_cached_acl(ip, type);
if (acl != ACL_NOT_CACHED)
return (acl);
+#endif
switch (type) {
case ACL_TYPE_ACCESS:
@@ -1049,8 +1056,11 @@ zpl_get_acl(struct inode *ip, int type)
if (size > 0)
kmem_free(value, size);
+ /* As of Linux 4.7, the kernel get_acl will set this for us */
+#ifndef HAVE_KERNEL_GET_ACL_HANDLE_CACHE
if (!IS_ERR(acl))
zpl_set_cached_acl(ip, type, acl);
+#endif
return (acl);
}