|
@@ -192,16 +192,18 @@ generic_acl_chmod(struct inode *inode)
|
|
int
|
|
int
|
|
generic_check_acl(struct inode *inode, int mask, unsigned int flags)
|
|
generic_check_acl(struct inode *inode, int mask, unsigned int flags)
|
|
{
|
|
{
|
|
- struct posix_acl *acl;
|
|
|
|
-
|
|
|
|
- if (flags & IPERM_FLAG_RCU)
|
|
|
|
- return -ECHILD;
|
|
|
|
-
|
|
|
|
- acl = get_cached_acl(inode, ACL_TYPE_ACCESS);
|
|
|
|
- if (acl) {
|
|
|
|
- int error = posix_acl_permission(inode, acl, mask);
|
|
|
|
- posix_acl_release(acl);
|
|
|
|
- return error;
|
|
|
|
|
|
+ if (flags & IPERM_FLAG_RCU) {
|
|
|
|
+ if (!negative_cached_acl(inode, ACL_TYPE_ACCESS))
|
|
|
|
+ return -ECHILD;
|
|
|
|
+ } else {
|
|
|
|
+ struct posix_acl *acl;
|
|
|
|
+
|
|
|
|
+ acl = get_cached_acl(inode, ACL_TYPE_ACCESS);
|
|
|
|
+ if (acl) {
|
|
|
|
+ int error = posix_acl_permission(inode, acl, mask);
|
|
|
|
+ posix_acl_release(acl);
|
|
|
|
+ return error;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return -EAGAIN;
|
|
return -EAGAIN;
|
|
}
|
|
}
|