summaryrefslogtreecommitdiff
path: root/fs/bcachefs/dirent.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-10-09 16:23:30 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:29 +0300
commit495fa1a2ec78a94bc1857531925b212edb670d2c (patch)
tree7f1f6201d5364a49ae4df73a617f610785626306 /fs/bcachefs/dirent.c
parent3826ee0b17557e85813378be5a5a695baf607c1c (diff)
downloadlinux-495fa1a2ec78a94bc1857531925b212edb670d2c.tar.xz
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>
Diffstat (limited to 'fs/bcachefs/dirent.c')
-rw-r--r--fs/bcachefs/dirent.c19
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;