diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-10-09 09:23:30 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:29 -0400 |
commit | 495fa1a2ec78a94bc1857531925b212edb670d2c (patch) | |
tree | 7f1f6201d5364a49ae4df73a617f610785626306 | |
parent | 3826ee0b17557e85813378be5a5a695baf607c1c (diff) |
bcachefs: Refactor bch2_readdir() a bit
The tweaks to ctx->pos handling are also to help the fuse port
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-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; |