Re: [PATCH 1/2] fs: make file_dentry() a simple accessor

Stefan Berger
2024-02-02T15:16:54Z

On 2/2/24 06:01, Amir Goldstein wrote:
> file_dentry() is a relic from the days that overlayfs was using files with
> a "fake" path, meaning, f_path on overlayfs and f_inode on underlying fs.
>
> In those days, file_dentry() was needed to get the underlying fs dentry
> that matches f_inode.
>
> Files with "fake" path should not exist nowadays, so make file_dentry() a
> simple accessor and use an assertion to make sure that file_dentry() was
> not papering over filesystem bugs.
>
> Signed-off-by: Amir Goldstein <amir73il@gmail.com>

Tested-by: Stefan Berger <stefanb@linux.ibm.com>

> ---
> include/linux/fs.h | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 023f37c60709..de9aa86d2624 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1078,9 +1078,20 @@ static inline struct inode *file_inode(const struct file *f)
> return f->f_inode;
> }
>
> +/*
> + * file_dentry() is a relic from the days that overlayfs was using files with a
> + * "fake" path, meaning, f_path on overlayfs and f_inode on underlying fs.
> + * In those days, file_dentry() was needed to get the underlying fs dentry that
> + * matches f_inode.
> + * Files with "fake" path should not exist nowadays, so use an assertion to make
> + * sure that file_dentry() was not papering over filesystem bugs.
> + */
> static inline struct dentry *file_dentry(const struct file *file)
> {
> - return d_real(file->f_path.dentry, file_inode(file));
> + struct dentry *dentry = file->f_path.dentry;
> +
> + WARN_ON_ONCE(d_inode(dentry) != file_inode(file));
> + return dentry;
> }
>
> struct fasync_struct {