erofs: add erofs_sb_free() helper
[ Upstream commit e2de3c1bf6a0c99b089bd706a62da8f988918858 ] Unify the common parts of erofs_fc_free() and erofs_kill_sb() as erofs_sb_free(). Thus, fput() in erofs_fc_get_tree() is no longer needed, too. Reviewed-by: Chao Yu <chao@kernel.org> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20241212133504.2047178-1-hsiangkao@linux.alibaba.com Stable-dep-of: 6422cde1b0d5 ("erofs: use buffered I/O for file-backed mounts by default") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
532d40c321
commit
910798ecd3
+20
-18
@@ -718,16 +718,19 @@ static int erofs_fc_get_tree(struct fs_context *fc)
|
|||||||
GET_TREE_BDEV_QUIET_LOOKUP : 0);
|
GET_TREE_BDEV_QUIET_LOOKUP : 0);
|
||||||
#ifdef CONFIG_EROFS_FS_BACKED_BY_FILE
|
#ifdef CONFIG_EROFS_FS_BACKED_BY_FILE
|
||||||
if (ret == -ENOTBLK) {
|
if (ret == -ENOTBLK) {
|
||||||
|
struct file *file;
|
||||||
|
|
||||||
if (!fc->source)
|
if (!fc->source)
|
||||||
return invalf(fc, "No source specified");
|
return invalf(fc, "No source specified");
|
||||||
sbi->fdev = filp_open(fc->source, O_RDONLY | O_LARGEFILE, 0);
|
|
||||||
if (IS_ERR(sbi->fdev))
|
file = filp_open(fc->source, O_RDONLY | O_LARGEFILE, 0);
|
||||||
return PTR_ERR(sbi->fdev);
|
if (IS_ERR(file))
|
||||||
|
return PTR_ERR(file);
|
||||||
|
sbi->fdev = file;
|
||||||
|
|
||||||
if (S_ISREG(file_inode(sbi->fdev)->i_mode) &&
|
if (S_ISREG(file_inode(sbi->fdev)->i_mode) &&
|
||||||
sbi->fdev->f_mapping->a_ops->read_folio)
|
sbi->fdev->f_mapping->a_ops->read_folio)
|
||||||
return get_tree_nodev(fc, erofs_fc_fill_super);
|
return get_tree_nodev(fc, erofs_fc_fill_super);
|
||||||
fput(sbi->fdev);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
@@ -778,17 +781,22 @@ static void erofs_free_dev_context(struct erofs_dev_context *devs)
|
|||||||
kfree(devs);
|
kfree(devs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void erofs_sb_free(struct erofs_sb_info *sbi)
|
||||||
|
{
|
||||||
|
erofs_free_dev_context(sbi->devs);
|
||||||
|
kfree(sbi->fsid);
|
||||||
|
kfree(sbi->domain_id);
|
||||||
|
if (sbi->fdev)
|
||||||
|
fput(sbi->fdev);
|
||||||
|
kfree(sbi);
|
||||||
|
}
|
||||||
|
|
||||||
static void erofs_fc_free(struct fs_context *fc)
|
static void erofs_fc_free(struct fs_context *fc)
|
||||||
{
|
{
|
||||||
struct erofs_sb_info *sbi = fc->s_fs_info;
|
struct erofs_sb_info *sbi = fc->s_fs_info;
|
||||||
|
|
||||||
if (!sbi)
|
if (sbi) /* free here if an error occurs before transferring to sb */
|
||||||
return;
|
erofs_sb_free(sbi);
|
||||||
|
|
||||||
erofs_free_dev_context(sbi->devs);
|
|
||||||
kfree(sbi->fsid);
|
|
||||||
kfree(sbi->domain_id);
|
|
||||||
kfree(sbi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct fs_context_operations erofs_context_ops = {
|
static const struct fs_context_operations erofs_context_ops = {
|
||||||
@@ -828,15 +836,9 @@ static void erofs_kill_sb(struct super_block *sb)
|
|||||||
kill_anon_super(sb);
|
kill_anon_super(sb);
|
||||||
else
|
else
|
||||||
kill_block_super(sb);
|
kill_block_super(sb);
|
||||||
|
|
||||||
erofs_free_dev_context(sbi->devs);
|
|
||||||
fs_put_dax(sbi->dax_dev, NULL);
|
fs_put_dax(sbi->dax_dev, NULL);
|
||||||
erofs_fscache_unregister_fs(sb);
|
erofs_fscache_unregister_fs(sb);
|
||||||
kfree(sbi->fsid);
|
erofs_sb_free(sbi);
|
||||||
kfree(sbi->domain_id);
|
|
||||||
if (sbi->fdev)
|
|
||||||
fput(sbi->fdev);
|
|
||||||
kfree(sbi);
|
|
||||||
sb->s_fs_info = NULL;
|
sb->s_fs_info = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user