bcachefs: Refactor bch2_readdir() a bit
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 9 Oct 2019 13:23:30 +0000 (09:23 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:29 +0000 (17:08 -0400)
The tweaks to ctx->pos handling are also to help the fuse port

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/dirent.c

index 2a3e830ebf500a39015ec1d154d09beaadca926b..38017699c04af3a01d17cb1239efdaa452e1b8fd 100644 (file)
@@ -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;