diff mbox series

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

Message ID 20240202110132.1584111-2-amir73il@gmail.com (mailing list archive)
State New
Headers show
Series Decomplicate file_dentry() | expand

Commit Message

Amir Goldstein Feb. 2, 2024, 11:01 a.m. UTC
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>
---
 include/linux/fs.h | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

Comments

Stefan Berger Feb. 2, 2024, 3:16 p.m. UTC | #1
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 {
diff mbox series

Patch

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 {