Howdy Al... I applied your orangefs patch to 6.7.0-rc6 and found one xfstests failure that was not there when I ran against xfstests-6.7.0-rc5. (generic/438) I'm about to hit the road for a several day motorcycle ride in an hour or so, I just wanted to give feedback before Ieft. I'll look into it further when I get back. -Mike On Wed, Dec 20, 2023 at 12:33 AM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > orangefs_dir_fill() doesn't use oi and dentry arguments at all > do_readdir() gets dentry, uses only dentry->d_inode; it also > gets oi, which is ORANGEFS_I(dentry->d_inode) (i.e. ->d_inode - > constant offset). > orangefs_dir_mode() gets dentry and oi, uses only to pass those > to do_readdir(). > orangefs_dir_iterate() uses dentry and oi only to pass those to > orangefs_dir_fill() and orangefs_dir_more(). > > The only thing it really needs is ->d_inode; moreover, that's > better expressed as file_inode(file) - no need to go through > ->f_path.dentry->d_inode. > > Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> > --- > fs/orangefs/dir.c | 32 ++++++++++++-------------------- > 1 file changed, 12 insertions(+), 20 deletions(-) > > diff --git a/fs/orangefs/dir.c b/fs/orangefs/dir.c > index 9cacce5d55c1..6d1fbeca9d81 100644 > --- a/fs/orangefs/dir.c > +++ b/fs/orangefs/dir.c > @@ -58,10 +58,10 @@ struct orangefs_dir { > * first part of the part list. > */ > > -static int do_readdir(struct orangefs_inode_s *oi, > - struct orangefs_dir *od, struct dentry *dentry, > +static int do_readdir(struct orangefs_dir *od, struct inode *inode, > struct orangefs_kernel_op_s *op) > { > + struct orangefs_inode_s *oi = ORANGEFS_I(inode); > struct orangefs_readdir_response_s *resp; > int bufi, r; > > @@ -87,7 +87,7 @@ static int do_readdir(struct orangefs_inode_s *oi, > op->upcall.req.readdir.buf_index = bufi; > > r = service_operation(op, "orangefs_readdir", > - get_interruptible_flag(dentry->d_inode)); > + get_interruptible_flag(inode)); > > orangefs_readdir_index_put(bufi); > > @@ -158,8 +158,7 @@ static int parse_readdir(struct orangefs_dir *od, > return 0; > } > > -static int orangefs_dir_more(struct orangefs_inode_s *oi, > - struct orangefs_dir *od, struct dentry *dentry) > +static int orangefs_dir_more(struct orangefs_dir *od, struct inode *inode) > { > struct orangefs_kernel_op_s *op; > int r; > @@ -169,7 +168,7 @@ static int orangefs_dir_more(struct orangefs_inode_s *oi, > od->error = -ENOMEM; > return -ENOMEM; > } > - r = do_readdir(oi, od, dentry, op); > + r = do_readdir(od, inode, op); > if (r) { > od->error = r; > goto out; > @@ -238,9 +237,7 @@ static int fill_from_part(struct orangefs_dir_part *part, > return 1; > } > > -static int orangefs_dir_fill(struct orangefs_inode_s *oi, > - struct orangefs_dir *od, struct dentry *dentry, > - struct dir_context *ctx) > +static int orangefs_dir_fill(struct orangefs_dir *od, struct dir_context *ctx) > { > struct orangefs_dir_part *part; > size_t count; > @@ -304,15 +301,10 @@ static loff_t orangefs_dir_llseek(struct file *file, loff_t offset, > static int orangefs_dir_iterate(struct file *file, > struct dir_context *ctx) > { > - struct orangefs_inode_s *oi; > - struct orangefs_dir *od; > - struct dentry *dentry; > + struct orangefs_dir *od = file->private_data; > + struct inode *inode = file_inode(file); > int r; > > - dentry = file->f_path.dentry; > - oi = ORANGEFS_I(dentry->d_inode); > - od = file->private_data; > - > if (od->error) > return od->error; > > @@ -342,7 +334,7 @@ static int orangefs_dir_iterate(struct file *file, > */ > while (od->token != ORANGEFS_ITERATE_END && > ctx->pos > od->end) { > - r = orangefs_dir_more(oi, od, dentry); > + r = orangefs_dir_more(od, inode); > if (r) > return r; > } > @@ -351,17 +343,17 @@ static int orangefs_dir_iterate(struct file *file, > > /* Then try to fill if there's any left in the buffer. */ > if (ctx->pos < od->end) { > - r = orangefs_dir_fill(oi, od, dentry, ctx); > + r = orangefs_dir_fill(od, ctx); > if (r) > return r; > } > > /* Finally get some more and try to fill. */ > if (od->token != ORANGEFS_ITERATE_END) { > - r = orangefs_dir_more(oi, od, dentry); > + r = orangefs_dir_more(od, inode); > if (r) > return r; > - r = orangefs_dir_fill(oi, od, dentry, ctx); > + r = orangefs_dir_fill(od, ctx); > } > > return r; > -- > 2.39.2 > >