diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-04-16 14:48:51 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:01 -0400 |
commit | ae8bbb9fac2c74ce3132adae7b059d1cb8535039 (patch) | |
tree | 9c7a00c7dd4b82a5afe1415d7e27ce5c847a909b /fs/bcachefs/fsck.c | |
parent | 5e6a668b19614c44819c4b0f7691da92df973384 (diff) |
bcachefs: Simplify fsck remove_dirent()
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/fsck.c')
-rw-r--r-- | fs/bcachefs/fsck.c | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c index fa1922cb5c87..e6036d36e0f9 100644 --- a/fs/bcachefs/fsck.c +++ b/fs/bcachefs/fsck.c @@ -81,51 +81,37 @@ static int write_inode(struct btree_trans *trans, return ret; } -static int __remove_dirent(struct btree_trans *trans, - struct bkey_s_c_dirent dirent) +static int __remove_dirent(struct btree_trans *trans, struct bpos pos) { struct bch_fs *c = trans->c; - struct qstr name; + struct btree_iter *iter; struct bch_inode_unpacked dir_inode; struct bch_hash_info dir_hash_info; - u64 dir_inum = dirent.k->p.inode; int ret; - char *buf; - - name.len = bch2_dirent_name_bytes(dirent); - buf = bch2_trans_kmalloc(trans, name.len + 1); - if (IS_ERR(buf)) - return PTR_ERR(buf); - - memcpy(buf, dirent.v->d_name, name.len); - buf[name.len] = '\0'; - name.name = buf; - ret = lookup_inode(trans, dir_inum, &dir_inode, NULL); - if (ret && ret != -EINTR) - bch_err(c, "remove_dirent: err %i looking up directory inode", ret); + ret = lookup_inode(trans, pos.inode, &dir_inode, NULL); if (ret) return ret; dir_hash_info = bch2_hash_info_init(c, &dir_inode); - ret = bch2_hash_delete(trans, bch2_dirent_hash_desc, - &dir_hash_info, dir_inum, &name); - if (ret && ret != -EINTR) - bch_err(c, "remove_dirent: err %i deleting dirent", ret); - if (ret) - return ret; + iter = bch2_trans_get_iter(trans, BTREE_ID_dirents, pos, BTREE_ITER_INTENT); - return 0; + ret = bch2_hash_delete_at(trans, bch2_dirent_hash_desc, + &dir_hash_info, iter); + bch2_trans_iter_put(trans, iter); + return ret; } -static int remove_dirent(struct btree_trans *trans, - struct bkey_s_c_dirent dirent) +static int remove_dirent(struct btree_trans *trans, struct bpos pos) { - return __bch2_trans_do(trans, NULL, NULL, - BTREE_INSERT_NOFAIL| - BTREE_INSERT_LAZY_RW, - __remove_dirent(trans, dirent)); + int ret = __bch2_trans_do(trans, NULL, NULL, + BTREE_INSERT_NOFAIL| + BTREE_INSERT_LAZY_RW, + __remove_dirent(trans, pos)); + if (ret) + bch_err(trans->c, "remove_dirent: err %i deleting dirent", ret); + return ret; } static int __reattach_inode(struct btree_trans *trans, @@ -202,7 +188,7 @@ static int remove_backpointer(struct btree_trans *trans, goto out; } - ret = remove_dirent(trans, bkey_s_c_to_dirent(k)); + ret = remove_dirent(trans, k.k->p); out: bch2_trans_iter_put(trans, iter); return ret; @@ -752,7 +738,7 @@ retry: "dirent points to missing inode:\n%s", (bch2_bkey_val_to_text(&PBUF(buf), c, k), buf))) { - ret = remove_dirent(&trans, d); + ret = remove_dirent(&trans, d.k->p); if (ret) goto err; goto next; @@ -783,7 +769,7 @@ retry: backpointer_exists, c, "directory %llu with multiple links", target.bi_inum)) { - ret = remove_dirent(&trans, d); + ret = remove_dirent(&trans, d.k->p); if (ret) goto err; continue; |