summaryrefslogtreecommitdiff
path: root/fs/bcachefs/alloc_background.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/alloc_background.c')
-rw-r--r--fs/bcachefs/alloc_background.c252
1 files changed, 98 insertions, 154 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index d64839c756bc..4c1604fd80f9 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -565,11 +565,11 @@ void bch2_bucket_gens_to_text(struct printbuf *out, struct bch_fs *c, struct bke
int bch2_bucket_gens_init(struct bch_fs *c)
{
- struct btree_trans *trans = bch2_trans_get(c);
struct bkey_i_bucket_gens g;
bool have_bucket_gens_key = false;
int ret;
+ CLASS(btree_trans, trans)(c);
ret = for_each_btree_key(trans, iter, BTREE_ID_alloc, POS_MIN,
BTREE_ITER_prefetch, k, ({
/*
@@ -609,17 +609,14 @@ iter_err:
BCH_TRANS_COMMIT_no_enospc,
bch2_btree_insert_trans(trans, BTREE_ID_bucket_gens, &g.k_i, 0));
- bch2_trans_put(trans);
-
- bch_err_fn(c, ret);
return ret;
}
int bch2_alloc_read(struct bch_fs *c)
{
- down_read(&c->state_lock);
+ guard(rwsem_read)(&c->state_lock);
- struct btree_trans *trans = bch2_trans_get(c);
+ CLASS(btree_trans, trans)(c);
struct bch_dev *ca = NULL;
int ret;
@@ -680,10 +677,6 @@ int bch2_alloc_read(struct bch_fs *c)
}
bch2_dev_put(ca);
- bch2_trans_put(trans);
-
- up_read(&c->state_lock);
- bch_err_fn(c, ret);
return ret;
}
@@ -699,7 +692,7 @@ static int __need_discard_or_freespace_err(struct btree_trans *trans,
? BCH_FSCK_ERR_need_discard_key_wrong
: BCH_FSCK_ERR_freespace_key_wrong;
enum btree_id btree = discard ? BTREE_ID_need_discard : BTREE_ID_freespace;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
bch2_bkey_val_to_text(&buf, c, alloc_k);
@@ -711,8 +704,6 @@ static int __need_discard_or_freespace_err(struct btree_trans *trans,
if (bch2_err_matches(ret, BCH_ERR_fsck_ignore) ||
bch2_err_matches(ret, BCH_ERR_fsck_errors_not_fixed))
ret = 0;
-
- printbuf_exit(&buf);
return ret;
}
@@ -860,10 +851,10 @@ int bch2_trigger_alloc(struct btree_trans *trans,
enum btree_iter_update_trigger_flags flags)
{
struct bch_fs *c = trans->c;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
int ret = 0;
- struct bch_dev *ca = bch2_dev_bucket_tryget(c, new.k->p);
+ CLASS(bch2_dev_bucket_tryget, ca)(c, new.k->p);
if (!ca)
return bch_err_throw(c, trigger_alloc);
@@ -879,7 +870,7 @@ int bch2_trigger_alloc(struct btree_trans *trans,
struct bkey_i_alloc_v4 *new_ka = bch2_alloc_to_v4_mut_inlined(trans, new.s_c);
ret = PTR_ERR_OR_ZERO(new_ka);
if (unlikely(ret))
- goto err;
+ return ret;
new_a = &new_ka->v;
}
@@ -913,7 +904,7 @@ int bch2_trigger_alloc(struct btree_trans *trans,
ret = bch2_bucket_do_index(trans, ca, old, old_a, false) ?:
bch2_bucket_do_index(trans, ca, new.s_c, new_a, true);
if (ret)
- goto err;
+ return ret;
}
if (new_a->data_type == BCH_DATA_cached &&
@@ -925,7 +916,7 @@ int bch2_trigger_alloc(struct btree_trans *trans,
alloc_lru_idx_read(*old_a),
alloc_lru_idx_read(*new_a));
if (ret)
- goto err;
+ return ret;
ret = bch2_lru_change(trans,
BCH_LRU_BUCKET_FRAGMENTATION,
@@ -933,17 +924,17 @@ int bch2_trigger_alloc(struct btree_trans *trans,
alloc_lru_idx_fragmentation(*old_a, ca),
alloc_lru_idx_fragmentation(*new_a, ca));
if (ret)
- goto err;
+ return ret;
if (old_a->gen != new_a->gen) {
ret = bch2_bucket_gen_update(trans, new.k->p, new_a->gen);
if (ret)
- goto err;
+ return ret;
}
ret = bch2_alloc_key_to_dev_counters(trans, ca, old_a, new_a, flags);
if (ret)
- goto err;
+ return ret;
}
if ((flags & BTREE_TRIGGER_atomic) && (flags & BTREE_TRIGGER_insert)) {
@@ -994,7 +985,7 @@ int bch2_trigger_alloc(struct btree_trans *trans,
if (bch2_fs_fatal_err_on(ret, c,
"setting bucket_needs_journal_commit: %s",
bch2_err_str(ret)))
- goto err;
+ return ret;
}
}
@@ -1036,16 +1027,12 @@ int bch2_trigger_alloc(struct btree_trans *trans,
g->gen_valid = 1;
g->gen = new_a->gen;
}
-err:
fsck_err:
- printbuf_exit(&buf);
- bch2_dev_put(ca);
return ret;
invalid_bucket:
bch2_fs_inconsistent(c, "reference to invalid bucket\n%s",
(bch2_bkey_val_to_text(&buf, c, new.s_c), buf.buf));
- ret = bch_err_throw(c, trigger_alloc);
- goto err;
+ return bch_err_throw(c, trigger_alloc);
}
/*
@@ -1164,10 +1151,10 @@ int bch2_check_alloc_key(struct btree_trans *trans,
const struct bch_alloc_v4 *a;
unsigned gens_offset;
struct bkey_s_c k;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
int ret = 0;
- struct bch_dev *ca = bch2_dev_bucket_tryget_noerror(c, alloc_k.k->p);
+ CLASS(bch2_dev_bucket_tryget_noerror, ca)(c, alloc_k.k->p);
if (fsck_err_on(!ca,
trans, alloc_key_to_missing_dev_bucket,
"alloc key for invalid device:bucket %llu:%llu",
@@ -1177,7 +1164,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
return ret;
if (!ca->mi.freespace_initialized)
- goto out;
+ return 0;
a = bch2_alloc_to_v4(alloc_k, &a_convert);
@@ -1185,35 +1172,35 @@ int bch2_check_alloc_key(struct btree_trans *trans,
k = bch2_btree_iter_peek_slot(trans, discard_iter);
ret = bkey_err(k);
if (ret)
- goto err;
+ return ret;
bool is_discarded = a->data_type == BCH_DATA_need_discard;
if (need_discard_or_freespace_err_on(!!k.k->type != is_discarded,
trans, alloc_k, !is_discarded, true, true)) {
ret = bch2_btree_bit_mod_iter(trans, discard_iter, is_discarded);
if (ret)
- goto err;
+ return ret;
}
bch2_btree_iter_set_pos(trans, freespace_iter, alloc_freespace_pos(alloc_k.k->p, *a));
k = bch2_btree_iter_peek_slot(trans, freespace_iter);
ret = bkey_err(k);
if (ret)
- goto err;
+ return ret;
bool is_free = a->data_type == BCH_DATA_free;
if (need_discard_or_freespace_err_on(!!k.k->type != is_free,
trans, alloc_k, !is_free, false, true)) {
ret = bch2_btree_bit_mod_iter(trans, freespace_iter, is_free);
if (ret)
- goto err;
+ return ret;
}
bch2_btree_iter_set_pos(trans, bucket_gens_iter, alloc_gens_pos(alloc_k.k->p, &gens_offset));
k = bch2_btree_iter_peek_slot(trans, bucket_gens_iter);
ret = bkey_err(k);
if (ret)
- goto err;
+ return ret;
if (fsck_err_on(a->gen != alloc_gen(k, gens_offset),
trans, bucket_gens_key_wrong,
@@ -1226,7 +1213,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
ret = PTR_ERR_OR_ZERO(g);
if (ret)
- goto err;
+ return ret;
if (k.k->type == KEY_TYPE_bucket_gens) {
bkey_reassemble(&g->k_i, k);
@@ -1239,13 +1226,9 @@ int bch2_check_alloc_key(struct btree_trans *trans,
ret = bch2_trans_update(trans, bucket_gens_iter, &g->k_i, 0);
if (ret)
- goto err;
+ return ret;
}
-out:
-err:
fsck_err:
- bch2_dev_put(ca);
- printbuf_exit(&buf);
return ret;
}
@@ -1257,7 +1240,7 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
struct btree_iter *freespace_iter)
{
struct bkey_s_c k;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
int ret;
if (!ca->mi.freespace_initialized)
@@ -1268,7 +1251,7 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
k = bch2_btree_iter_peek_slot(trans, freespace_iter);
ret = bkey_err(k);
if (ret)
- goto err;
+ return ret;
*end = bkey_min(k.k->p, *end);
@@ -1281,10 +1264,9 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
end->offset)) {
struct bkey_i *update =
bch2_trans_kmalloc(trans, sizeof(*update));
-
ret = PTR_ERR_OR_ZERO(update);
if (ret)
- goto err;
+ return ret;
bkey_init(&update->k);
update->k.type = KEY_TYPE_set;
@@ -1295,11 +1277,9 @@ int bch2_check_alloc_hole_freespace(struct btree_trans *trans,
ret = bch2_trans_update(trans, freespace_iter, update, 0);
if (ret)
- goto err;
+ return ret;
}
-err:
fsck_err:
- printbuf_exit(&buf);
return ret;
}
@@ -1310,7 +1290,7 @@ int bch2_check_alloc_hole_bucket_gens(struct btree_trans *trans,
struct btree_iter *bucket_gens_iter)
{
struct bkey_s_c k;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
unsigned i, gens_offset, gens_end_offset;
int ret;
@@ -1319,7 +1299,7 @@ int bch2_check_alloc_hole_bucket_gens(struct btree_trans *trans,
k = bch2_btree_iter_peek_slot(trans, bucket_gens_iter);
ret = bkey_err(k);
if (ret)
- goto err;
+ return ret;
if (bkey_cmp(alloc_gens_pos(start, &gens_offset),
alloc_gens_pos(*end, &gens_end_offset)))
@@ -1345,23 +1325,20 @@ int bch2_check_alloc_hole_bucket_gens(struct btree_trans *trans,
if (need_update) {
struct bkey_i *u = bch2_trans_kmalloc(trans, sizeof(g));
-
ret = PTR_ERR_OR_ZERO(u);
if (ret)
- goto err;
+ return ret;
memcpy(u, &g, sizeof(g));
ret = bch2_trans_update(trans, bucket_gens_iter, u, 0);
if (ret)
- goto err;
+ return ret;
}
}
*end = bkey_min(*end, bucket_gens_pos_to_alloc(bpos_nosnap_successor(k.k->p), 0));
-err:
fsck_err:
- printbuf_exit(&buf);
return ret;
}
@@ -1404,7 +1381,7 @@ int __bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_i
enum bch_data_type state = iter->btree_id == BTREE_ID_need_discard
? BCH_DATA_need_discard
: BCH_DATA_free;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
bool async_repair = fsck_flags & FSCK_ERR_NO_LOG;
fsck_flags |= FSCK_CAN_FIX|FSCK_CAN_IGNORE;
@@ -1456,7 +1433,6 @@ out:
fsck_err:
bch2_set_btree_iter_dontneed(trans, &alloc_iter);
bch2_trans_iter_exit(trans, &alloc_iter);
- printbuf_exit(&buf);
return ret;
delete:
if (!async_repair) {
@@ -1513,19 +1489,19 @@ int bch2_check_bucket_gens_key(struct btree_trans *trans,
u64 end = bucket_gens_pos_to_alloc(bpos_nosnap_successor(k.k->p), 0).offset;
u64 b;
bool need_update = false;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
int ret = 0;
BUG_ON(k.k->type != KEY_TYPE_bucket_gens);
bkey_reassemble(&g.k_i, k);
- struct bch_dev *ca = bch2_dev_tryget_noerror(c, k.k->p.inode);
+ CLASS(bch2_dev_tryget_noerror, ca)(c, k.k->p.inode);
if (!ca) {
if (fsck_err(trans, bucket_gens_to_invalid_dev,
"bucket_gens key for invalid device:\n%s",
(bch2_bkey_val_to_text(&buf, c, k), buf.buf)))
- ret = bch2_btree_delete_at(trans, iter, 0);
- goto out;
+ return bch2_btree_delete_at(trans, iter, 0);
+ return 0;
}
if (fsck_err_on(end <= ca->mi.first_bucket ||
@@ -1533,8 +1509,7 @@ int bch2_check_bucket_gens_key(struct btree_trans *trans,
trans, bucket_gens_to_invalid_buckets,
"bucket_gens key for invalid buckets:\n%s",
(bch2_bkey_val_to_text(&buf, c, k), buf.buf))) {
- ret = bch2_btree_delete_at(trans, iter, 0);
- goto out;
+ return bch2_btree_delete_at(trans, iter, 0);
}
for (b = start; b < ca->mi.first_bucket; b++)
@@ -1555,30 +1530,26 @@ int bch2_check_bucket_gens_key(struct btree_trans *trans,
if (need_update) {
struct bkey_i *u = bch2_trans_kmalloc(trans, sizeof(g));
-
ret = PTR_ERR_OR_ZERO(u);
if (ret)
- goto out;
+ return ret;
memcpy(u, &g, sizeof(g));
- ret = bch2_trans_update(trans, iter, u, 0);
+ return bch2_trans_update(trans, iter, u, 0);
}
-out:
fsck_err:
- bch2_dev_put(ca);
- printbuf_exit(&buf);
return ret;
}
int bch2_check_alloc_info(struct bch_fs *c)
{
- struct btree_trans *trans = bch2_trans_get(c);
struct btree_iter iter, discard_iter, freespace_iter, bucket_gens_iter;
struct bch_dev *ca = NULL;
struct bkey hole;
struct bkey_s_c k;
int ret = 0;
+ CLASS(btree_trans, trans)(c);
bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, POS_MIN,
BTREE_ITER_prefetch);
bch2_trans_iter_init(trans, &discard_iter, BTREE_ID_need_discard, POS_MIN,
@@ -1646,14 +1617,14 @@ bkey_err:
ca = NULL;
if (ret < 0)
- goto err;
+ return ret;
ret = for_each_btree_key(trans, iter,
BTREE_ID_need_discard, POS_MIN,
BTREE_ITER_prefetch, k,
bch2_check_discard_freespace_key(trans, &iter));
if (ret)
- goto err;
+ return ret;
bch2_trans_iter_init(trans, &iter, BTREE_ID_freespace, POS_MIN,
BTREE_ITER_prefetch);
@@ -1670,11 +1641,9 @@ bkey_err:
continue;
}
if (ret) {
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
bch2_bkey_val_to_text(&buf, c, k);
-
bch_err(c, "while checking %s", buf.buf);
- printbuf_exit(&buf);
break;
}
@@ -1682,16 +1651,14 @@ bkey_err:
}
bch2_trans_iter_exit(trans, &iter);
if (ret)
- goto err;
+ return ret;
ret = for_each_btree_key_commit(trans, iter,
BTREE_ID_bucket_gens, POS_MIN,
BTREE_ITER_prefetch, k,
NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
bch2_check_bucket_gens_key(trans, &iter, k));
-err:
- bch2_trans_put(trans);
- bch_err_fn(c, ret);
+
return ret;
}
@@ -1703,7 +1670,7 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
struct bch_alloc_v4 a_convert;
const struct bch_alloc_v4 *a;
struct bkey_s_c alloc_k;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
int ret;
alloc_k = bch2_btree_iter_peek(trans, alloc_iter);
@@ -1714,7 +1681,7 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
if (ret)
return ret;
- struct bch_dev *ca = bch2_dev_tryget_noerror(c, alloc_k.k->p.inode);
+ CLASS(bch2_dev_tryget_noerror, ca)(c, alloc_k.k->p.inode);
if (!ca)
return 0;
@@ -1726,95 +1693,80 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
bucket_to_u64(alloc_k.k->p),
lru_idx, alloc_k, last_flushed);
if (ret)
- goto err;
+ return ret;
}
- if (a->data_type != BCH_DATA_cached)
- goto err;
+ if (a->data_type == BCH_DATA_cached) {
+ if (fsck_err_on(!a->io_time[READ],
+ trans, alloc_key_cached_but_read_time_zero,
+ "cached bucket with read_time 0\n%s",
+ (printbuf_reset(&buf),
+ bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) {
+ struct bkey_i_alloc_v4 *a_mut =
+ bch2_alloc_to_v4_mut(trans, alloc_k);
+ ret = PTR_ERR_OR_ZERO(a_mut);
+ if (ret)
+ return ret;
- if (fsck_err_on(!a->io_time[READ],
- trans, alloc_key_cached_but_read_time_zero,
- "cached bucket with read_time 0\n%s",
- (printbuf_reset(&buf),
- bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) {
- struct bkey_i_alloc_v4 *a_mut =
- bch2_alloc_to_v4_mut(trans, alloc_k);
- ret = PTR_ERR_OR_ZERO(a_mut);
- if (ret)
- goto err;
+ a_mut->v.io_time[READ] = bch2_current_io_time(c, READ);
+ ret = bch2_trans_update(trans, alloc_iter,
+ &a_mut->k_i, BTREE_TRIGGER_norun);
+ if (ret)
+ return ret;
- a_mut->v.io_time[READ] = bch2_current_io_time(c, READ);
- ret = bch2_trans_update(trans, alloc_iter,
- &a_mut->k_i, BTREE_TRIGGER_norun);
- if (ret)
- goto err;
+ a = &a_mut->v;
+ }
- a = &a_mut->v;
+ ret = bch2_lru_check_set(trans, alloc_k.k->p.inode,
+ bucket_to_u64(alloc_k.k->p),
+ a->io_time[READ],
+ alloc_k, last_flushed);
}
-
- ret = bch2_lru_check_set(trans, alloc_k.k->p.inode,
- bucket_to_u64(alloc_k.k->p),
- a->io_time[READ],
- alloc_k, last_flushed);
- if (ret)
- goto err;
-err:
fsck_err:
- bch2_dev_put(ca);
- printbuf_exit(&buf);
return ret;
}
int bch2_check_alloc_to_lru_refs(struct bch_fs *c)
{
struct bkey_buf last_flushed;
-
bch2_bkey_buf_init(&last_flushed);
bkey_init(&last_flushed.k->k);
- int ret = bch2_trans_run(c,
- for_each_btree_key_commit(trans, iter, BTREE_ID_alloc,
+ CLASS(btree_trans, trans)(c);
+ int ret = for_each_btree_key_commit(trans, iter, BTREE_ID_alloc,
POS_MIN, BTREE_ITER_prefetch, k,
NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
- bch2_check_alloc_to_lru_ref(trans, &iter, &last_flushed))) ?:
- bch2_check_stripe_to_lru_refs(c);
+ bch2_check_alloc_to_lru_ref(trans, &iter, &last_flushed)) ?:
+ bch2_check_stripe_to_lru_refs(trans);
bch2_bkey_buf_exit(&last_flushed, c);
- bch_err_fn(c, ret);
return ret;
}
static int discard_in_flight_add(struct bch_dev *ca, u64 bucket, bool in_progress)
{
struct bch_fs *c = ca->fs;
- int ret;
- mutex_lock(&ca->discard_buckets_in_flight_lock);
+ guard(mutex)(&ca->discard_buckets_in_flight_lock);
struct discard_in_flight *i =
darray_find_p(ca->discard_buckets_in_flight, i, i->bucket == bucket);
- if (i) {
- ret = bch_err_throw(c, EEXIST_discard_in_flight_add);
- goto out;
- }
+ if (i)
+ return bch_err_throw(c, EEXIST_discard_in_flight_add);
- ret = darray_push(&ca->discard_buckets_in_flight, ((struct discard_in_flight) {
+ return darray_push(&ca->discard_buckets_in_flight, ((struct discard_in_flight) {
.in_progress = in_progress,
.bucket = bucket,
}));
-out:
- mutex_unlock(&ca->discard_buckets_in_flight_lock);
- return ret;
}
static void discard_in_flight_remove(struct bch_dev *ca, u64 bucket)
{
- mutex_lock(&ca->discard_buckets_in_flight_lock);
+ guard(mutex)(&ca->discard_buckets_in_flight_lock);
struct discard_in_flight *i =
darray_find_p(ca->discard_buckets_in_flight, i, i->bucket == bucket);
BUG_ON(!i || !i->in_progress);
darray_remove_item(&ca->discard_buckets_in_flight, i);
- mutex_unlock(&ca->discard_buckets_in_flight_lock);
}
struct discard_buckets_state {
@@ -1836,7 +1788,7 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
struct btree_iter iter = {};
struct bkey_s_c k;
struct bkey_i_alloc_v4 *a;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
bool discard_locked = false;
int ret = 0;
@@ -1927,7 +1879,6 @@ fsck_err:
if (!ret)
s->seen++;
bch2_trans_iter_exit(trans, &iter);
- printbuf_exit(&buf);
return ret;
}
@@ -2024,17 +1975,16 @@ static void bch2_do_discards_fast_work(struct work_struct *work)
bool got_bucket = false;
u64 bucket;
- mutex_lock(&ca->discard_buckets_in_flight_lock);
- darray_for_each(ca->discard_buckets_in_flight, i) {
- if (i->in_progress)
- continue;
+ scoped_guard(mutex, &ca->discard_buckets_in_flight_lock)
+ darray_for_each(ca->discard_buckets_in_flight, i) {
+ if (i->in_progress)
+ continue;
- got_bucket = true;
- bucket = i->bucket;
- i->in_progress = true;
- break;
- }
- mutex_unlock(&ca->discard_buckets_in_flight_lock);
+ got_bucket = true;
+ bucket = i->bucket;
+ i->in_progress = true;
+ break;
+ }
if (!got_bucket)
break;
@@ -2142,7 +2092,7 @@ static int invalidate_one_bucket(struct btree_trans *trans,
s64 *nr_to_invalidate)
{
struct bch_fs *c = trans->c;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
struct bpos bucket = u64_to_bucket(lru_k.k->p.offset);
struct btree_iter alloc_iter = {};
int ret = 0;
@@ -2203,7 +2153,6 @@ static int invalidate_one_bucket(struct btree_trans *trans,
out:
fsck_err:
bch2_trans_iter_exit(trans, &alloc_iter);
- printbuf_exit(&buf);
return ret;
}
@@ -2226,7 +2175,7 @@ static void bch2_do_invalidates_work(struct work_struct *work)
{
struct bch_dev *ca = container_of(work, struct bch_dev, invalidate_work);
struct bch_fs *c = ca->fs;
- struct btree_trans *trans = bch2_trans_get(c);
+ CLASS(btree_trans, trans)(c);
int ret = 0;
struct bkey_buf last_flushed;
@@ -2268,7 +2217,6 @@ restart_err:
}
bch2_trans_iter_exit(trans, &iter);
err:
- bch2_trans_put(trans);
bch2_bkey_buf_exit(&last_flushed, c);
enumerated_ref_put(&ca->io_ref[WRITE], BCH_DEV_WRITE_REF_do_invalidates);
enumerated_ref_put(&c->writes, BCH_WRITE_REF_invalidate);
@@ -2301,18 +2249,17 @@ void bch2_do_invalidates(struct bch_fs *c)
int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca,
u64 bucket_start, u64 bucket_end)
{
- struct btree_trans *trans = bch2_trans_get(c);
struct btree_iter iter;
struct bkey_s_c k;
struct bkey hole;
struct bpos end = POS(ca->dev_idx, bucket_end);
- struct bch_member *m;
unsigned long last_updated = jiffies;
int ret;
BUG_ON(bucket_start > bucket_end);
BUG_ON(bucket_end > ca->mi.nbuckets);
+ CLASS(btree_trans, trans)(c);
bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
POS(ca->dev_idx, max_t(u64, ca->mi.first_bucket, bucket_start)),
BTREE_ITER_prefetch);
@@ -2383,17 +2330,16 @@ bkey_err:
}
bch2_trans_iter_exit(trans, &iter);
- bch2_trans_put(trans);
if (ret < 0) {
bch_err_msg(ca, ret, "initializing free space");
return ret;
}
- mutex_lock(&c->sb_lock);
- m = bch2_members_v2_get_mut(c->disk_sb.sb, ca->dev_idx);
- SET_BCH_MEMBER_FREESPACE_INITIALIZED(m, true);
- mutex_unlock(&c->sb_lock);
+ scoped_guard(mutex, &c->sb_lock) {
+ struct bch_member *m = bch2_members_v2_get_mut(c->disk_sb.sb, ca->dev_idx);
+ SET_BCH_MEMBER_FREESPACE_INITIALIZED(m, true);
+ }
return 0;
}
@@ -2403,7 +2349,6 @@ int bch2_fs_freespace_init(struct bch_fs *c)
if (c->sb.features & BIT_ULL(BCH_FEATURE_small_image))
return 0;
-
/*
* We can crash during the device add path, so we need to check this on
* every mount:
@@ -2428,9 +2373,8 @@ int bch2_fs_freespace_init(struct bch_fs *c)
}
if (doing_init) {
- mutex_lock(&c->sb_lock);
+ guard(mutex)(&c->sb_lock);
bch2_write_super(c);
- mutex_unlock(&c->sb_lock);
bch_verbose(c, "done initializing freespace");
}