diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-11-03 21:24:52 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-11-03 21:28:23 -0400 |
commit | 42ba8b5a75b844446b91d43b6434fe3479143583 (patch) | |
tree | db073550ebb6d3a27ce762d2e476107c43b8f509 /libbcachefs/fsck.c | |
parent | 9a649545a3263f2a6f85d724e8bcfbd6aeedcdaf (diff) |
Update bcachefs sources to 5fd0c70102 bcachefs: Fix __remove_dirent()
Diffstat (limited to 'libbcachefs/fsck.c')
-rw-r--r-- | libbcachefs/fsck.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/libbcachefs/fsck.c b/libbcachefs/fsck.c index 5bc04c7b..9519ced9 100644 --- a/libbcachefs/fsck.c +++ b/libbcachefs/fsck.c @@ -113,6 +113,35 @@ static int subvol_lookup(struct btree_trans *trans, u32 subvol, return lockrestart_do(trans, __subvol_lookup(trans, subvol, snapshot, inum)); } +static int lookup_first_inode(struct btree_trans *trans, u64 inode_nr, + struct bch_inode_unpacked *inode) +{ + struct btree_iter iter; + struct bkey_s_c k; + int ret; + + bch2_trans_iter_init(trans, &iter, BTREE_ID_inodes, + POS(0, inode_nr), + BTREE_ITER_ALL_SNAPSHOTS); + k = bch2_btree_iter_peek(&iter); + ret = bkey_err(k); + if (ret) + goto err; + + if (!k.k || bkey_cmp(k.k->p, POS(0, inode_nr))) { + ret = -ENOENT; + goto err; + } + + ret = bch2_inode_unpack(bkey_s_c_to_inode(k), inode); +err: + if (ret && ret != -EINTR) + bch_err(trans->c, "error %i fetching inode %llu", + ret, inode_nr); + bch2_trans_iter_exit(trans, &iter); + return ret; +} + static int __lookup_inode(struct btree_trans *trans, u64 inode_nr, struct bch_inode_unpacked *inode, u32 *snapshot) @@ -272,7 +301,7 @@ static int __remove_dirent(struct btree_trans *trans, struct bpos pos) struct bch_hash_info dir_hash_info; int ret; - ret = __lookup_inode(trans, pos.inode, &dir_inode, NULL); + ret = lookup_first_inode(trans, pos.inode, &dir_inode); if (ret) return ret; @@ -669,7 +698,7 @@ static int check_key_has_snapshot(struct btree_trans *trans, char buf[200]; int ret = 0; - if (fsck_err_on(!snapshot_t(c, k.k->p.snapshot)->equiv, c, + if (mustfix_fsck_err_on(!snapshot_t(c, k.k->p.snapshot)->equiv, c, "key in missing snapshot: %s", (bch2_bkey_val_to_text(&PBUF(buf), c, k), buf))) return bch2_btree_delete_at(trans, iter, @@ -918,8 +947,7 @@ static int check_inodes(struct bch_fs *c, bool full) bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); - bch2_trans_iter_init(&trans, &iter, BTREE_ID_inodes, - POS(BCACHEFS_ROOT_INO, 0), + bch2_trans_iter_init(&trans, &iter, BTREE_ID_inodes, POS_MIN, BTREE_ITER_INTENT| BTREE_ITER_PREFETCH| BTREE_ITER_ALL_SNAPSHOTS); |