From: Kent Overstreet <kent.overstreet@gmail.com>
Date: Wed, 9 Oct 2019 13:23:30 +0000 (-0400)
Subject: bcachefs: Refactor bch2_readdir() a bit
X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=495fa1a2ec78a94bc1857531925b212edb670d2c;p=linux.git

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>
---

diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c
index 2a3e830ebf500..38017699c04af 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;