On Wed, Jun 14, 2023 at 10:49:06AM +0300, Amir Goldstein wrote: > +static struct file *__alloc_file(int flags, const struct cred *cred) > +{ > + struct file *f; > + int error; > + > + f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL); > + if (unlikely(!f)) > + return ERR_PTR(-ENOMEM); > + > + error = init_file(f, flags, cred); > + if (unlikely(error)) > + return ERR_PTR(error); > + > return f; Nit: is there much of a point in keeping this now very trivial helper instead of open coding it in the two callers? > +/* > + * Variant of alloc_empty_file() that allocates a backing_file container > + * and doesn't check and modify nr_files. > + * > + * Should not be used unless there's a very good reason to do so. I'm not sure this comment is all that helpful.. I'd rather explain when it should be used (i.e. only from open_backing_file) then when it should not.. > -struct file *open_with_fake_path(const struct path *path, int flags, > - struct inode *inode, const struct cred *cred) > +struct file *open_backing_file(const struct path *path, int flags, > + const struct path *real_path, > + const struct cred *cred) Please write a big fat comment on where this function should and should not be used and how it works. > +struct path *backing_file_real_path(struct file *f); > +static inline const struct path *f_real_path(struct file *f) > +{ > + if (unlikely(f->f_mode & FMODE_BACKING)) > + return backing_file_real_path(f); > + else > + return &f->f_path; > +} Nit: no need for the else here.