mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
ANDROID: mnt: remount should propagate to slaves of slaves
propagate_remount was not accounting for the slave mounts of other slave mounts, leading to some namespaces not recieving the remount information. Signed-off-by: Daniel Rosenberg <drosen@google.com> Bug: 33731928 Change-Id: Idc9e8c2ed126a4143229fc23f10a959c2d0a3854
This commit is contained in:
parent
cd769ec65b
commit
fdfefc2e98
2 changed files with 22 additions and 7 deletions
27
fs/pnode.c
27
fs/pnode.c
|
@ -395,16 +395,31 @@ int propagate_umount(struct list_head *list)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int propagate_remount(struct mount *mnt) {
|
/*
|
||||||
struct mount *m;
|
* Iterates over all slaves, and slaves of slaves.
|
||||||
|
*/
|
||||||
|
static struct mount *next_descendent(struct mount *root, struct mount *cur)
|
||||||
|
{
|
||||||
|
if (!IS_MNT_NEW(cur) && !list_empty(&cur->mnt_slave_list))
|
||||||
|
return first_slave(cur);
|
||||||
|
do {
|
||||||
|
if (cur->mnt_slave.next != &cur->mnt_master->mnt_slave_list)
|
||||||
|
return next_slave(cur);
|
||||||
|
cur = cur->mnt_master;
|
||||||
|
} while (cur != root);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void propagate_remount(struct mount *mnt)
|
||||||
|
{
|
||||||
|
struct mount *m = mnt;
|
||||||
struct super_block *sb = mnt->mnt.mnt_sb;
|
struct super_block *sb = mnt->mnt.mnt_sb;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (sb->s_op->copy_mnt_data) {
|
if (sb->s_op->copy_mnt_data) {
|
||||||
for (m = first_slave(mnt); m->mnt_slave.next != &mnt->mnt_slave_list; m = next_slave(m)) {
|
m = next_descendent(mnt, m);
|
||||||
|
while (m) {
|
||||||
sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data);
|
sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data);
|
||||||
|
m = next_descendent(mnt, m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ int propagate_mnt(struct mount *, struct dentry *, struct mount *,
|
||||||
struct list_head *);
|
struct list_head *);
|
||||||
int propagate_umount(struct list_head *);
|
int propagate_umount(struct list_head *);
|
||||||
int propagate_mount_busy(struct mount *, int);
|
int propagate_mount_busy(struct mount *, int);
|
||||||
int propagate_remount(struct mount *);
|
void propagate_remount(struct mount *);
|
||||||
void mnt_release_group_id(struct mount *);
|
void mnt_release_group_id(struct mount *);
|
||||||
int get_dominating_id(struct mount *mnt, const struct path *root);
|
int get_dominating_id(struct mount *mnt, const struct path *root);
|
||||||
unsigned int mnt_get_count(struct mount *mnt);
|
unsigned int mnt_get_count(struct mount *mnt);
|
||||||
|
|
Loading…
Reference in a new issue