On Tue, Nov 14, 2023 at 03:56:50PM +0000, Matthew Wilcox wrote: > 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 ... On purpose, it's an eye catcher because I didn't have a better idea. It obviously worked! > > @@ -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? Yes, thanks. That's a better idea. -- Chuck Lever