summaryrefslogtreecommitdiff
path: root/fs/bcachefs/str_hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/str_hash.c')
-rw-r--r--fs/bcachefs/str_hash.c51
1 files changed, 22 insertions, 29 deletions
diff --git a/fs/bcachefs/str_hash.c b/fs/bcachefs/str_hash.c
index d39fd4261e1b..ce2a54902a64 100644
--- a/fs/bcachefs/str_hash.c
+++ b/fs/bcachefs/str_hash.c
@@ -18,16 +18,14 @@ static int bch2_dirent_has_target(struct btree_trans *trans, struct bkey_s_c_dir
return ret;
return !ret;
} else {
- struct btree_iter iter;
- struct bkey_s_c k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_inodes,
+ CLASS(btree_iter, iter)(trans, BTREE_ID_inodes,
SPOS(0, le64_to_cpu(d.v->d_inum), d.k->p.snapshot), 0);
+ struct bkey_s_c k = bch2_btree_iter_peek_slot(&iter);
int ret = bkey_err(k);
if (ret)
return ret;
- ret = bkey_is_inode(k.k);
- bch2_trans_iter_exit(trans, &iter);
- return ret;
+ return bkey_is_inode(k.k);
}
}
@@ -123,9 +121,8 @@ int bch2_repair_inode_hash_info(struct btree_trans *trans,
struct bch_inode_unpacked *snapshot_root)
{
struct bch_fs *c = trans->c;
- struct btree_iter iter;
struct bkey_s_c k;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
bool need_commit = false;
int ret = 0;
@@ -180,10 +177,10 @@ int bch2_repair_inode_hash_info(struct btree_trans *trans,
}
if (ret)
- goto err;
+ return ret;
if (!need_commit) {
- struct printbuf buf = PRINTBUF;
+ printbuf_reset(&buf);
bch2_log_msg_start(c, &buf);
prt_printf(&buf, "inode %llu hash info mismatch with root, but mismatch not found\n",
@@ -198,17 +195,12 @@ int bch2_repair_inode_hash_info(struct btree_trans *trans,
prt_printf(&buf, " %llx %llx", hash_info->siphash_key.k0, hash_info->siphash_key.k1);
#endif
bch2_print_str(c, KERN_ERR, buf.buf);
- printbuf_exit(&buf);
- ret = bch_err_throw(c, fsck_repair_unimplemented);
- goto err;
+ return bch_err_throw(c, fsck_repair_unimplemented);
}
ret = bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc) ?:
bch_err_throw(c, transaction_restart_nested);
-err:
fsck_err:
- printbuf_exit(&buf);
- bch2_trans_iter_exit(trans, &iter);
return ret;
}
@@ -244,7 +236,7 @@ int bch2_str_hash_repair_key(struct btree_trans *trans,
bool *updated_before_k_pos)
{
struct bch_fs *c = trans->c;
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
bool free_snapshots_seen = false;
int ret = 0;
@@ -330,8 +322,7 @@ duplicate_entries:
}
out:
fsck_err:
- bch2_trans_iter_exit(trans, dup_iter);
- printbuf_exit(&buf);
+ bch2_trans_iter_exit(dup_iter);
if (free_snapshots_seen)
darray_exit(&s->ids);
return ret;
@@ -346,7 +337,7 @@ int __bch2_str_hash_check_key(struct btree_trans *trans,
{
struct bch_fs *c = trans->c;
struct btree_iter iter = {};
- struct printbuf buf = PRINTBUF;
+ CLASS(printbuf, buf)();
struct bkey_s_c k;
int ret = 0;
@@ -354,10 +345,14 @@ int __bch2_str_hash_check_key(struct btree_trans *trans,
if (hash_k.k->p.offset < hash)
goto bad_hash;
- for_each_btree_key_norestart(trans, iter, desc->btree_id,
- SPOS(hash_k.k->p.inode, hash, hash_k.k->p.snapshot),
- BTREE_ITER_slots|
- BTREE_ITER_with_updates, k, ret) {
+ bch2_trans_iter_init(trans, &iter, desc->btree_id,
+ SPOS(hash_k.k->p.inode, hash, hash_k.k->p.snapshot),
+ BTREE_ITER_slots|
+ BTREE_ITER_with_updates);
+
+ for_each_btree_key_continue_norestart(iter,
+ BTREE_ITER_slots|
+ BTREE_ITER_with_updates, k, ret) {
if (bkey_eq(k.k->p, hash_k.k->p))
break;
@@ -374,19 +369,17 @@ int __bch2_str_hash_check_key(struct btree_trans *trans,
if (bkey_deleted(k.k))
goto bad_hash;
}
- bch2_trans_iter_exit(trans, &iter);
-out:
+ bch2_trans_iter_exit(&iter);
fsck_err:
- printbuf_exit(&buf);
return ret;
bad_hash:
- bch2_trans_iter_exit(trans, &iter);
+ bch2_trans_iter_exit(&iter);
/*
* Before doing any repair, check hash_info itself:
*/
ret = check_inode_hash_info_matches_root(trans, hash_k.k->p.inode, hash_info);
if (ret)
- goto out;
+ return ret;
if (fsck_err(trans, hash_table_key_wrong_offset,
"hash table key at wrong offset: should be at %llu\n%s",
@@ -396,5 +389,5 @@ bad_hash:
k_iter, hash_k,
&iter, bkey_s_c_null,
updated_before_k_pos);
- goto out;
+ return ret;
}