From: Daniel Rosenberg Date: Sat, 12 Jan 2019 02:44:18 +0000 (-0800) Subject: ANDROID: mnt: Propagate remount correctly X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=398001773b80e7acb29d1ee234c49b91c4e3f979;p=GitHub%2Fexynos8895%2Fandroid_kernel_samsung_universal8895.git 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 Change-Id: Ic35cd2782a646435689f5bedfa1f218fe4ab8254 --- diff --git a/fs/pnode.c b/fs/pnode.c index 8702b2f3bce0..9a3811651cd5 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -687,44 +687,26 @@ int propagate_umount(struct list_head *list) 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) { - struct mount *m = mnt; + struct mount *parent = mnt->mnt_parent; + struct mount *p = mnt, *m; #ifdef CONFIG_RKP_NS_PROT struct super_block *sb = mnt->mnt->mnt_sb; #else struct super_block *sb = mnt->mnt.mnt_sb; #endif - if (sb->s_op->copy_mnt_data) { - m = next_descendent(mnt, m); - while (m) { + if (!sb->s_op->copy_mnt_data) + return; + for (p = propagation_next(parent, parent); p; + p = propagation_next(p, parent)) { + m = __lookup_mnt(&p->mnt, mnt->mnt_mountpoint); + if (m) #ifdef CONFIG_RKP_NS_PROT sb->s_op->copy_mnt_data(m->mnt->data, mnt->mnt->data); #else sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data); #endif - m = next_descendent(mnt, m); - } } }