diff options
author | Chunwei Chen <[email protected]> | 2016-08-08 17:26:21 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-08-09 10:03:04 -0700 |
commit | afb6c031e87d511abd9f0f4ec629ab1972490269 (patch) | |
tree | 830fd62e1b69d8f82bbfa14f635299f55be430d1 /module/zfs | |
parent | 88c4c7a0671afef9016446e0132ba86622929092 (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.c | 10 |
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); } |