On Mon 24-02-25 21:20:31, Al Viro wrote: > It has two possible values - one for "forced lookup" entries, another > for the normal ones. We'd be better off with that as an explicit > flag anyway and in addition to that it opens some fun possibilities > with ->d_op and ->d_flags handling. > > Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> FWIW I went through the patches and I like them. They look mostly straightforward enough to me and as good simplifications. Honza > --- > fs/proc/generic.c | 8 +++++--- > fs/proc/internal.h | 5 +++-- > 2 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/fs/proc/generic.c b/fs/proc/generic.c > index 8ec90826a49e..499c2bf67488 100644 > --- a/fs/proc/generic.c > +++ b/fs/proc/generic.c > @@ -254,7 +254,10 @@ struct dentry *proc_lookup_de(struct inode *dir, struct dentry *dentry, > inode = proc_get_inode(dir->i_sb, de); > if (!inode) > return ERR_PTR(-ENOMEM); > - d_set_d_op(dentry, de->proc_dops); > + if (de->flags & PROC_ENTRY_FORCE_LOOKUP) > + d_set_d_op(dentry, &proc_net_dentry_ops); > + else > + d_set_d_op(dentry, &proc_misc_dentry_ops); > return d_splice_alias(inode, dentry); > } > read_unlock(&proc_subdir_lock); > @@ -448,9 +451,8 @@ static struct proc_dir_entry *__proc_create(struct proc_dir_entry **parent, > INIT_LIST_HEAD(&ent->pde_openers); > proc_set_user(ent, (*parent)->uid, (*parent)->gid); > > - ent->proc_dops = &proc_misc_dentry_ops; > /* Revalidate everything under /proc/${pid}/net */ > - if ((*parent)->proc_dops == &proc_net_dentry_ops) > + if ((*parent)->flags & PROC_ENTRY_FORCE_LOOKUP) > pde_force_lookup(ent); > > out: > diff --git a/fs/proc/internal.h b/fs/proc/internal.h > index 1695509370b8..07f75c959173 100644 > --- a/fs/proc/internal.h > +++ b/fs/proc/internal.h > @@ -44,7 +44,6 @@ struct proc_dir_entry { > const struct proc_ops *proc_ops; > const struct file_operations *proc_dir_ops; > }; > - const struct dentry_operations *proc_dops; > union { > const struct seq_operations *seq_ops; > int (*single_show)(struct seq_file *, void *); > @@ -67,6 +66,8 @@ struct proc_dir_entry { > char inline_name[]; > } __randomize_layout; > > +#define PROC_ENTRY_FORCE_LOOKUP 2 /* same space as PROC_ENTRY_PERMANENT */ > + > #define SIZEOF_PDE ( \ > sizeof(struct proc_dir_entry) < 128 ? 128 : \ > sizeof(struct proc_dir_entry) < 192 ? 192 : \ > @@ -346,7 +347,7 @@ extern const struct dentry_operations proc_net_dentry_ops; > static inline void pde_force_lookup(struct proc_dir_entry *pde) > { > /* /proc/net/ entries can be changed under us by setns(CLONE_NEWNET) */ > - pde->proc_dops = &proc_net_dentry_ops; > + pde->flags |= PROC_ENTRY_FORCE_LOOKUP; > } > > /* > -- > 2.39.5 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR