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>
This commit is contained in:
parent
3826ee0b17
commit
495fa1a2ec
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user