fs/fat/nfs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fat_scan_logstart() leaves the matching directory entry's buffer head in
sinfo.bh for the caller to release, just like fat_scan().
fat_rebuild_parent() uses the directory entry to rebuild the parent inode
for the nostale_ro NFS export path, but does not release sinfo.bh after a
successful scan. Release it once fat_build_inode() has consumed the
directory entry data.
Fixes: f1e6fb0ab451 ("fat (exportfs): rebuild directory-inode if fat_dget()")
Signed-off-by: Yichong Chen <chenyichong@uniontech.com>
---
fs/fat/nfs.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/fat/nfs.c b/fs/fat/nfs.c
index 509eea9..6e1b371 100644
--- a/fs/fat/nfs.c
+++ b/fs/fat/nfs.c
@@ -250,8 +250,10 @@ struct inode *fat_rebuild_parent(struct super_block *sb, int parent_logstart)
MSDOS_I(dummy_grand_parent)->i_pos = -1;
}
- if (!fat_scan_logstart(dummy_grand_parent, clus_to_match, &sinfo))
+ if (!fat_scan_logstart(dummy_grand_parent, clus_to_match, &sinfo)) {
parent = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
+ brelse(sinfo.bh);
+ }
brelse(parent_bh);
iput(dummy_grand_parent);
--
2.51.0
Yichong Chen <chenyichong@uniontech.com> writes:
> fat_scan_logstart() leaves the matching directory entry's buffer head in
> sinfo.bh for the caller to release, just like fat_scan().
>
> fat_rebuild_parent() uses the directory entry to rebuild the parent inode
> for the nostale_ro NFS export path, but does not release sinfo.bh after a
> successful scan. Release it once fat_build_inode() has consumed the
> directory entry data.
>
> Fixes: f1e6fb0ab451 ("fat (exportfs): rebuild directory-inode if fat_dget()")
> Signed-off-by: Yichong Chen <chenyichong@uniontech.com>
Looks good, thanks.
Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
> ---
> fs/fat/nfs.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/fs/fat/nfs.c b/fs/fat/nfs.c
> index 509eea9..6e1b371 100644
> --- a/fs/fat/nfs.c
> +++ b/fs/fat/nfs.c
> @@ -250,8 +250,10 @@ struct inode *fat_rebuild_parent(struct super_block *sb, int parent_logstart)
> MSDOS_I(dummy_grand_parent)->i_pos = -1;
> }
>
> - if (!fat_scan_logstart(dummy_grand_parent, clus_to_match, &sinfo))
> + if (!fat_scan_logstart(dummy_grand_parent, clus_to_match, &sinfo)) {
> parent = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
> + brelse(sinfo.bh);
> + }
>
> brelse(parent_bh);
> iput(dummy_grand_parent);
--
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
© 2016 - 2026 Red Hat, Inc.