diff options
-rw-r--r-- | fs/bcachefs/dirent.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c index 2a3e830ebf50..38017699c04a 100644 --- a/fs/bcachefs/dirent.c +++ b/fs/bcachefs/dirent.c @@ -354,36 +354,31 @@ int bch2_readdir(struct bch_fs *c, u64 inum, struct dir_context *ctx) struct btree_iter *iter; struct bkey_s_c k; struct bkey_s_c_dirent dirent; - unsigned len; int ret; bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_DIRENTS, POS(inum, ctx->pos), 0, k, ret) { + if (k.k->p.inode > inum) + break; + if (k.k->type != KEY_TYPE_dirent) continue; dirent = bkey_s_c_to_dirent(k); - if (bkey_cmp(k.k->p, POS(inum, ctx->pos)) < 0) - continue; - - if (k.k->p.inode > inum) - break; - - len = bch2_dirent_name_bytes(dirent); - /* * XXX: dir_emit() can fault and block, while we're holding * locks */ - if (!dir_emit(ctx, dirent.v->d_name, len, + ctx->pos = dirent.k->p.offset; + if (!dir_emit(ctx, dirent.v->d_name, + bch2_dirent_name_bytes(dirent), le64_to_cpu(dirent.v->d_inum), dirent.v->d_type)) break; - - ctx->pos = k.k->p.offset + 1; + ctx->pos = dirent.k->p.offset + 1; } ret = bch2_trans_exit(&trans) ?: ret; |