diff options
author | Daniel Rosenberg <drosen@google.com> | 2019-01-11 18:44:18 -0800 |
---|---|---|
committer | Amit Pundir <amit.pundir@linaro.org> | 2019-02-15 12:34:40 +0530 |
commit | cb0a03a0645d9b0c1d16ba8482ffe39c83503d11 (patch) | |
tree | 906d6d90fa94cfa2c83172b8dd43abdbe3375f8e | |
parent | 964cc5ed63dc2897c01784ace55a82d05785b55d (diff) | |
download | kernel_replicant_linux-cb0a03a0645d9b0c1d16ba8482ffe39c83503d11.tar.gz kernel_replicant_linux-cb0a03a0645d9b0c1d16ba8482ffe39c83503d11.tar.bz2 kernel_replicant_linux-cb0a03a0645d9b0c1d16ba8482ffe39c83503d11.zip |
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
-rw-r--r-- | fs/pnode.c | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/fs/pnode.c b/fs/pnode.c index 7f11e46d4418..6a7960537945 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -609,36 +609,18 @@ 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; struct super_block *sb = mnt->mnt.mnt_sb; - 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) sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data); - m = next_descendent(mnt, m); - } } } |