ANDROID: incremental fs: Evict inodes before freeing mount data
Since evicting inodes triggers writes to the backing file, which uses
the mi_owner field from the mount_info struct, make sure inodes are
evicted before we free the mount_info data
Test: incfs_test
Bug: 270117845
Change-Id: I673b2e0e04b5adc3998caf6f22443598a30338af
Signed-off-by: Paul Lawrence <paullawrence@google.com>
(cherry picked from commit 7899985277527b29c47929a6d6a89c5c89b406ad)
diff --git a/fs/incfs/sysfs.c b/fs/incfs/sysfs.c
index 5c7e0fd..ba91c07 100644
--- a/fs/incfs/sysfs.c
+++ b/fs/incfs/sysfs.c
@@ -34,12 +34,14 @@ DECLARE_FEATURE_FLAG(corefs);
DECLARE_FEATURE_FLAG(zstd);
DECLARE_FEATURE_FLAG(v2);
DECLARE_FEATURE_FLAG(bugfix_throttling);
+DECLARE_FEATURE_FLAG(bugfix_inode_eviction);
static struct attribute *attributes[] = {
&corefs_attr.attr,
&zstd_attr.attr,
&v2_attr.attr,
&bugfix_throttling_attr.attr,
+ &bugfix_inode_eviction_attr.attr,
NULL,
};
diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c
index 855525c..70af66a 100644
--- a/fs/incfs/vfs.c
+++ b/fs/incfs/vfs.c
@@ -1928,6 +1928,13 @@ void incfs_kill_sb(struct super_block *sb)
pr_debug("incfs: unmount\n");
+ /*
+ * We must kill the super before freeing mi, since killing the super
+ * triggers inode eviction, which triggers the final update of the
+ * backing file, which uses certain information for mi
+ */
+ kill_anon_super(sb);
+
if (mi) {
if (mi->mi_backing_dir_path.dentry)
dinode = d_inode(mi->mi_backing_dir_path.dentry);
@@ -1943,7 +1950,6 @@ void incfs_kill_sb(struct super_block *sb)
incfs_free_mount_info(mi);
sb->s_fs_info = NULL;
}
- kill_anon_super(sb);
}
static int show_options(struct seq_file *m, struct dentry *root)