Message ID | 20240202110132.1584111-2-amir73il@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Decomplicate file_dentry() | expand |
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 --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 {
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(-)