Commit e2de3c1b authored by Gao Xiang's avatar Gao Xiang
Browse files

erofs: add erofs_sb_free() helper



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: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241212133504.2047178-1-hsiangkao@linux.alibaba.com
parent 6d191704
Loading
Loading
Loading
Loading
+19 −17
Original line number Diff line number Diff line
@@ -703,16 +703,19 @@ static int erofs_fc_get_tree(struct fs_context *fc)
			GET_TREE_BDEV_QUIET_LOOKUP : 0);
#ifdef CONFIG_EROFS_FS_BACKED_BY_FILE
	if (ret == -ENOTBLK) {
		struct file *file;

		if (!fc->source)
			return invalf(fc, "No source specified");
		sbi->fdev = filp_open(fc->source, O_RDONLY | O_LARGEFILE, 0);
		if (IS_ERR(sbi->fdev))
			return PTR_ERR(sbi->fdev);

		file = filp_open(fc->source, O_RDONLY | O_LARGEFILE, 0);
		if (IS_ERR(file))
			return PTR_ERR(file);
		sbi->fdev = file;

		if (S_ISREG(file_inode(sbi->fdev)->i_mode) &&
		    sbi->fdev->f_mapping->a_ops->read_folio)
			return get_tree_nodev(fc, erofs_fc_fill_super);
		fput(sbi->fdev);
	}
#endif
	return ret;
@@ -763,19 +766,24 @@ static void erofs_free_dev_context(struct erofs_dev_context *devs)
	kfree(devs);
}

static void erofs_fc_free(struct fs_context *fc)
static void erofs_sb_free(struct erofs_sb_info *sbi)
{
	struct erofs_sb_info *sbi = fc->s_fs_info;

	if (!sbi)
		return;

	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)
{
	struct erofs_sb_info *sbi = fc->s_fs_info;

	if (sbi) /* free here if an error occurs before transferring to sb */
		erofs_sb_free(sbi);
}

static const struct fs_context_operations erofs_context_ops = {
	.parse_param	= erofs_fc_parse_param,
	.get_tree       = erofs_fc_get_tree,
@@ -813,15 +821,9 @@ static void erofs_kill_sb(struct super_block *sb)
		kill_anon_super(sb);
	else
		kill_block_super(sb);

	erofs_free_dev_context(sbi->devs);
	fs_put_dax(sbi->dax_dev, NULL);
	erofs_fscache_unregister_fs(sb);
	kfree(sbi->fsid);
	kfree(sbi->domain_id);
	if (sbi->fdev)
		fput(sbi->fdev);
	kfree(sbi);
	erofs_sb_free(sbi);
	sb->s_fs_info = NULL;
}