mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
BACKPORT: ANDROID: mnt: Propagate remount correctly
This switches over to propagation_next to respect namepsace semantics. Test: Remounting to change the options of a fs with mount based options should propagate to all shared copies of that mount, and the slaves/indirect slaves of those. Bug: 122428178 Signed-off-by: Daniel Rosenberg <drosen@google.com> Change-Id: Ic35cd2782a646435689f5bedfa1f218fe4ab8254
This commit is contained in:
parent
c48074f579
commit
f35f655694
1 changed files with 8 additions and 26 deletions
34
fs/pnode.c
34
fs/pnode.c
|
@ -405,36 +405,18 @@ int propagate_umount(struct list_head *list)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 {
|
|
||||||
struct mount *master = cur->mnt_master;
|
|
||||||
|
|
||||||
if (!master || cur->mnt_slave.next != &master->mnt_slave_list) {
|
|
||||||
struct mount *next = next_slave(cur);
|
|
||||||
|
|
||||||
return (next == root) ? NULL : next;
|
|
||||||
}
|
|
||||||
cur = master;
|
|
||||||
} while (cur != root);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void propagate_remount(struct mount *mnt)
|
void propagate_remount(struct mount *mnt)
|
||||||
{
|
{
|
||||||
struct mount *m = mnt;
|
struct mount *parent = mnt->mnt_parent;
|
||||||
|
struct mount *p = mnt, *m;
|
||||||
struct super_block *sb = mnt->mnt.mnt_sb;
|
struct super_block *sb = mnt->mnt.mnt_sb;
|
||||||
|
|
||||||
if (sb->s_op->copy_mnt_data) {
|
if (!sb->s_op->copy_mnt_data)
|
||||||
m = next_descendent(mnt, m);
|
return;
|
||||||
while (m) {
|
for (p = propagation_next(parent, parent); p;
|
||||||
|
p = propagation_next(p, parent)) {
|
||||||
|
m = __lookup_mnt(&p->mnt, mnt->mnt_mountpoint, 0);
|
||||||
|
if (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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue