On Tue, Nov 14, 2023 at 10:49:37AM -0500, Chuck Lever wrote: > -static void offset_iterate_dir(struct inode *inode, struct dir_context *ctx) > +static void *offset_iterate_dir(struct inode *inode, struct dir_context *ctx) > { > struct offset_ctx *so_ctx = inode->i_op->get_offset_ctx(inode); > XA_STATE(xas, &so_ctx->xa, ctx->pos); > @@ -437,7 +437,8 @@ static void offset_iterate_dir(struct inode *inode, struct dir_context *ctx) > while (true) { > dentry = offset_find_next(&xas); > if (!dentry) > - break; > + /* readdir has reached the current EOD */ > + return (void *)0x10; Funny, you used the same bit pattern as ZERO_SIZE_PTR without using the macro ... > @@ -479,7 +481,12 @@ static int offset_readdir(struct file *file, struct dir_context *ctx) > if (!dir_emit_dots(file, ctx)) > return 0; > > - offset_iterate_dir(d_inode(dir), ctx); > + if (ctx->pos == 2) > + file->private_data = NULL; > + else if (file->private_data == (void *)0x10) > + return 0; > + > + file->private_data = offset_iterate_dir(d_inode(dir), ctx); > return 0; > } It might make more sense to use ERR_PTR(-ENOENT) or ERANGE or something that's a more understandable sentinel value?