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 <c...@kernel.org>
Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 fs/erofs/super.c | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index c235a8e4315e..de8e3ecc6381 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -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;
 }
 
-- 
2.43.5

Reply via email to