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: 268589017
Bug: 270117845
Bug: 280756362
Bug: 288025075
Bug: 292030724
Change-Id: I673b2e0e04b5adc3998caf6f22443598a30338af
Signed-off-by: Paul Lawrence <paullawrence@google.com>
Signed-off-by: Wilson Sung <wilsonsung@google.com>
(cherry picked from commit 7899985277527b29c47929a6d6a89c5c89b406ad)
diff --git a/fs/incfs/sysfs.c b/fs/incfs/sysfs.c
index 360f03c..0ba3d7c 100644
--- a/fs/incfs/sysfs.c
+++ b/fs/incfs/sysfs.c
@@ -33,11 +33,13 @@
 DECLARE_FEATURE_FLAG(corefs);
 DECLARE_FEATURE_FLAG(zstd);
 DECLARE_FEATURE_FLAG(v2);
+DECLARE_FEATURE_FLAG(bugfix_inode_eviction);
 
 static struct attribute *attributes[] = {
 	&corefs_attr.attr,
 	&zstd_attr.attr,
 	&v2_attr.attr,
+	&bugfix_inode_eviction_attr.attr,
 	NULL,
 };
 
diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c
index cde9fe9..d52ac31 100644
--- a/fs/incfs/vfs.c
+++ b/fs/incfs/vfs.c
@@ -1925,6 +1925,13 @@
 
 	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);
@@ -1942,7 +1949,6 @@
 		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)