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) (cherry picked from commit faf3626b8e34df3dfff3a99e6582a9abd24410ce)
This commit is contained in:
parent
5da4c29d97
commit
ae46662afa
@ -30,6 +30,15 @@ static ssize_t corefs_show(struct kobject *kobj,
|
|||||||
|
|
||||||
static struct kobj_attribute corefs_attr = __ATTR_RO(corefs);
|
static struct kobj_attribute corefs_attr = __ATTR_RO(corefs);
|
||||||
|
|
||||||
|
static ssize_t bugfix_inode_eviction_show(struct kobject *kobj,
|
||||||
|
struct kobj_attribute *attr, char *buff)
|
||||||
|
{
|
||||||
|
return snprintf(buff, PAGE_SIZE, "supported\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct kobj_attribute bugfix_inode_eviction_attr =
|
||||||
|
__ATTR_RO(bugfix_inode_eviction);
|
||||||
|
|
||||||
static ssize_t mounter_context_for_backing_rw_show(struct kobject *kobj,
|
static ssize_t mounter_context_for_backing_rw_show(struct kobject *kobj,
|
||||||
struct kobj_attribute *attr, char *buff)
|
struct kobj_attribute *attr, char *buff)
|
||||||
{
|
{
|
||||||
@ -41,6 +50,7 @@ static struct kobj_attribute mounter_context_for_backing_rw_attr =
|
|||||||
|
|
||||||
static struct attribute *attributes[] = {
|
static struct attribute *attributes[] = {
|
||||||
&corefs_attr.attr,
|
&corefs_attr.attr,
|
||||||
|
&bugfix_inode_eviction_attr.attr,
|
||||||
&mounter_context_for_backing_rw_attr.attr,
|
&mounter_context_for_backing_rw_attr.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
@ -2311,6 +2311,13 @@ void incfs_kill_sb(struct super_block *sb)
|
|||||||
|
|
||||||
pr_debug("incfs: unmount\n");
|
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) {
|
||||||
if (mi->mi_backing_dir_path.dentry)
|
if (mi->mi_backing_dir_path.dentry)
|
||||||
dinode = d_inode(mi->mi_backing_dir_path.dentry);
|
dinode = d_inode(mi->mi_backing_dir_path.dentry);
|
||||||
@ -2322,7 +2329,6 @@ void incfs_kill_sb(struct super_block *sb)
|
|||||||
incfs_free_mount_info(mi);
|
incfs_free_mount_info(mi);
|
||||||
sb->s_fs_info = NULL;
|
sb->s_fs_info = NULL;
|
||||||
}
|
}
|
||||||
kill_anon_super(sb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int show_options(struct seq_file *m, struct dentry *root)
|
static int show_options(struct seq_file *m, struct dentry *root)
|
||||||
|
Loading…
Reference in New Issue
Block a user