summaryrefslogtreecommitdiff
path: root/libbcachefs/acl.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-06-04 18:10:23 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-06-04 18:10:29 -0400
commit8642d4ae10f167a2eb850403f6d2b60757242b31 (patch)
tree6cd7f6586f779a806e7f33c8f3e76aebc1cf1064 /libbcachefs/acl.c
parent1f78fed4693a5361f56508daac59bebd5b556379 (diff)
Update bcachefs sources to 7c0fe6f104 bcachefs: Fix bch2_fsck_ask_yn()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'libbcachefs/acl.c')
-rw-r--r--libbcachefs/acl.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/libbcachefs/acl.c b/libbcachefs/acl.c
index 2bf58aa8..ce7a460f 100644
--- a/libbcachefs/acl.c
+++ b/libbcachefs/acl.c
@@ -35,12 +35,14 @@ static inline int acl_to_xattr_type(int type)
/*
* Convert from filesystem to in-memory representation.
*/
-static struct posix_acl *bch2_acl_from_disk(const void *value, size_t size)
+static struct posix_acl *bch2_acl_from_disk(struct btree_trans *trans,
+ const void *value, size_t size)
{
const void *p, *end = value + size;
struct posix_acl *acl;
struct posix_acl_entry *out;
unsigned count = 0;
+ int ret;
if (!value)
return NULL;
@@ -81,9 +83,14 @@ static struct posix_acl *bch2_acl_from_disk(const void *value, size_t size)
if (!count)
return NULL;
- acl = posix_acl_alloc(count, GFP_KERNEL);
+ acl = allocate_dropping_locks(trans, ret,
+ posix_acl_alloc(count, _gfp));
if (!acl)
return ERR_PTR(-ENOMEM);
+ if (ret) {
+ kfree(acl);
+ return ERR_PTR(ret);
+ }
out = acl->a_entries;
@@ -234,9 +241,7 @@ retry:
&X_SEARCH(acl_to_xattr_type(type), "", 0),
0);
if (ret) {
- if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
- goto retry;
- if (ret != -ENOENT)
+ if (!bch2_err_matches(ret, ENOENT))
acl = ERR_PTR(ret);
goto out;
}
@@ -249,12 +254,15 @@ retry:
}
xattr = bkey_s_c_to_xattr(k);
- acl = bch2_acl_from_disk(xattr_val(xattr.v),
+ acl = bch2_acl_from_disk(&trans, xattr_val(xattr.v),
le16_to_cpu(xattr.v->x_val_len));
if (!IS_ERR(acl))
set_cached_acl(&inode->v, type, acl);
out:
+ if (bch2_err_matches(PTR_ERR_OR_ZERO(acl), BCH_ERR_transaction_restart))
+ goto retry;
+
bch2_trans_iter_exit(&trans, &iter);
bch2_trans_exit(&trans);
return acl;
@@ -287,7 +295,7 @@ int bch2_set_acl_trans(struct btree_trans *trans, subvol_inum inum,
inum, &search);
}
- return ret == -ENOENT ? 0 : ret;
+ return bch2_err_matches(ret, ENOENT) ? 0 : ret;
}
int bch2_set_acl(struct mnt_idmap *idmap,
@@ -368,20 +376,21 @@ int bch2_acl_chmod(struct btree_trans *trans, subvol_inum inum,
&X_SEARCH(KEY_TYPE_XATTR_INDEX_POSIX_ACL_ACCESS, "", 0),
BTREE_ITER_INTENT);
if (ret)
- return ret == -ENOENT ? 0 : ret;
+ return bch2_err_matches(ret, ENOENT) ? 0 : ret;
k = bch2_btree_iter_peek_slot(&iter);
xattr = bkey_s_c_to_xattr(k);
if (ret)
goto err;
- acl = bch2_acl_from_disk(xattr_val(xattr.v),
+ acl = bch2_acl_from_disk(trans, xattr_val(xattr.v),
le16_to_cpu(xattr.v->x_val_len));
ret = PTR_ERR_OR_ZERO(acl);
if (IS_ERR_OR_NULL(acl))
goto err;
- ret = __posix_acl_chmod(&acl, GFP_KERNEL, mode);
+ ret = allocate_dropping_locks_errcode(trans,
+ __posix_acl_chmod(&acl, _gfp, mode));
if (ret)
goto err;