mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 08:31:55 +00:00
bcachefs: Quota: Don't allocate memory under lock
The genradix code can handle multiple threads trying to allocate at the same time - we don't need the genradix_ptr_alloc() call to happen under a lock. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
061f7999a6
commit
84fea8e5b3
@ -364,16 +364,16 @@ int bch2_quota_acct(struct bch_fs *c, struct bch_qid qid,
|
||||
|
||||
memset(&msgs, 0, sizeof(msgs));
|
||||
|
||||
for_each_set_qtype(c, i, q, qtypes) {
|
||||
mq[i] = genradix_ptr_alloc(&q->table, qid.q[i], GFP_KERNEL);
|
||||
if (!mq[i])
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for_each_set_qtype(c, i, q, qtypes)
|
||||
mutex_lock_nested(&q->lock, i);
|
||||
|
||||
for_each_set_qtype(c, i, q, qtypes) {
|
||||
mq[i] = genradix_ptr_alloc(&q->table, qid.q[i], GFP_NOFS);
|
||||
if (!mq[i]) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = bch2_quota_check_limit(c, i, mq[i], &msgs, counter, v, mode);
|
||||
if (ret)
|
||||
goto err;
|
||||
@ -416,18 +416,17 @@ int bch2_quota_transfer(struct bch_fs *c, unsigned qtypes,
|
||||
|
||||
memset(&msgs, 0, sizeof(msgs));
|
||||
|
||||
for_each_set_qtype(c, i, q, qtypes) {
|
||||
src_q[i] = genradix_ptr_alloc(&q->table, src.q[i], GFP_KERNEL);
|
||||
dst_q[i] = genradix_ptr_alloc(&q->table, dst.q[i], GFP_KERNEL);
|
||||
if (!src_q[i] || !dst_q[i])
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for_each_set_qtype(c, i, q, qtypes)
|
||||
mutex_lock_nested(&q->lock, i);
|
||||
|
||||
for_each_set_qtype(c, i, q, qtypes) {
|
||||
src_q[i] = genradix_ptr_alloc(&q->table, src.q[i], GFP_NOFS);
|
||||
dst_q[i] = genradix_ptr_alloc(&q->table, dst.q[i], GFP_NOFS);
|
||||
|
||||
if (!src_q[i] || !dst_q[i]) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = bch2_quota_check_limit(c, i, dst_q[i], &msgs, Q_SPC,
|
||||
dst_q[i]->c[Q_SPC].v + space,
|
||||
mode);
|
||||
|
Loading…
Reference in New Issue
Block a user