|
|
@@ -1039,9 +1039,6 @@ static void f2fs_put_super(struct super_block *sb)
|
|
|
f2fs_write_checkpoint(sbi, &cpc);
|
|
|
}
|
|
|
|
|
|
- /* f2fs_write_checkpoint can update stat informaion */
|
|
|
- f2fs_destroy_stats(sbi);
|
|
|
-
|
|
|
/*
|
|
|
* normally superblock is clean, so we need to release this.
|
|
|
* In addition, EIO will skip do checkpoint, we need this as well.
|
|
|
@@ -1061,6 +1058,12 @@ static void f2fs_put_super(struct super_block *sb)
|
|
|
iput(sbi->node_inode);
|
|
|
iput(sbi->meta_inode);
|
|
|
|
|
|
+ /*
|
|
|
+ * iput() can update stat information, if f2fs_write_checkpoint()
|
|
|
+ * above failed with error.
|
|
|
+ */
|
|
|
+ f2fs_destroy_stats(sbi);
|
|
|
+
|
|
|
/* destroy f2fs internal modules */
|
|
|
f2fs_destroy_node_manager(sbi);
|
|
|
f2fs_destroy_segment_manager(sbi);
|
|
|
@@ -2980,30 +2983,30 @@ try_onemore:
|
|
|
|
|
|
f2fs_build_gc_manager(sbi);
|
|
|
|
|
|
+ err = f2fs_build_stats(sbi);
|
|
|
+ if (err)
|
|
|
+ goto free_nm;
|
|
|
+
|
|
|
/* get an inode for node space */
|
|
|
sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi));
|
|
|
if (IS_ERR(sbi->node_inode)) {
|
|
|
f2fs_msg(sb, KERN_ERR, "Failed to read node inode");
|
|
|
err = PTR_ERR(sbi->node_inode);
|
|
|
- goto free_nm;
|
|
|
+ goto free_stats;
|
|
|
}
|
|
|
|
|
|
- err = f2fs_build_stats(sbi);
|
|
|
- if (err)
|
|
|
- goto free_node_inode;
|
|
|
-
|
|
|
/* read root inode and dentry */
|
|
|
root = f2fs_iget(sb, F2FS_ROOT_INO(sbi));
|
|
|
if (IS_ERR(root)) {
|
|
|
f2fs_msg(sb, KERN_ERR, "Failed to read root inode");
|
|
|
err = PTR_ERR(root);
|
|
|
- goto free_stats;
|
|
|
+ goto free_node_inode;
|
|
|
}
|
|
|
if (!S_ISDIR(root->i_mode) || !root->i_blocks ||
|
|
|
!root->i_size || !root->i_nlink) {
|
|
|
iput(root);
|
|
|
err = -EINVAL;
|
|
|
- goto free_stats;
|
|
|
+ goto free_node_inode;
|
|
|
}
|
|
|
|
|
|
sb->s_root = d_make_root(root); /* allocate root dentry */
|
|
|
@@ -3121,12 +3124,12 @@ free_sysfs:
|
|
|
free_root_inode:
|
|
|
dput(sb->s_root);
|
|
|
sb->s_root = NULL;
|
|
|
-free_stats:
|
|
|
- f2fs_destroy_stats(sbi);
|
|
|
free_node_inode:
|
|
|
f2fs_release_ino_entry(sbi, true);
|
|
|
truncate_inode_pages_final(NODE_MAPPING(sbi));
|
|
|
iput(sbi->node_inode);
|
|
|
+free_stats:
|
|
|
+ f2fs_destroy_stats(sbi);
|
|
|
free_nm:
|
|
|
f2fs_destroy_node_manager(sbi);
|
|
|
free_sm:
|