Skip to content

Commit 258a5aa

Browse files
author
Nick Piggin
committed
btrfs: provide simple rcu-walk ACL implementation
This simple implementation just checks for no ACLs on the inode, and if so, then the rcu-walk may proceed, otherwise fail it. Signed-off-by: Nick Piggin <npiggin@kernel.dk>
1 parent 7359861 commit 258a5aa

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

fs/btrfs/acl.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,18 +187,21 @@ static int btrfs_xattr_acl_set(struct dentry *dentry, const char *name,
187187

188188
int btrfs_check_acl(struct inode *inode, int mask, unsigned int flags)
189189
{
190-
struct posix_acl *acl;
191190
int error = -EAGAIN;
192191

193-
if (flags & IPERM_FLAG_RCU)
194-
return -ECHILD;
192+
if (flags & IPERM_FLAG_RCU) {
193+
if (!negative_cached_acl(inode, ACL_TYPE_ACCESS))
194+
error = -ECHILD;
195195

196-
acl = btrfs_get_acl(inode, ACL_TYPE_ACCESS);
197-
if (IS_ERR(acl))
198-
return PTR_ERR(acl);
199-
if (acl) {
200-
error = posix_acl_permission(inode, acl, mask);
201-
posix_acl_release(acl);
196+
} else {
197+
struct posix_acl *acl;
198+
acl = btrfs_get_acl(inode, ACL_TYPE_ACCESS);
199+
if (IS_ERR(acl))
200+
return PTR_ERR(acl);
201+
if (acl) {
202+
error = posix_acl_permission(inode, acl, mask);
203+
posix_acl_release(acl);
204+
}
202205
}
203206

204207
return error;

fs/btrfs/inode.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7213,9 +7213,6 @@ static int btrfs_set_page_dirty(struct page *page)
72137213

72147214
static int btrfs_permission(struct inode *inode, int mask, unsigned int flags)
72157215
{
7216-
if (flags & IPERM_FLAG_RCU)
7217-
return -ECHILD;
7218-
72197216
if ((BTRFS_I(inode)->flags & BTRFS_INODE_READONLY) && (mask & MAY_WRITE))
72207217
return -EACCES;
72217218
return generic_permission(inode, mask, flags, btrfs_check_acl);

0 commit comments

Comments
 (0)