aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Rosenberg <drosen@google.com>2019-01-11 18:44:18 -0800
committerAmit Pundir <amit.pundir@linaro.org>2019-02-15 12:34:40 +0530
commitcb0a03a0645d9b0c1d16ba8482ffe39c83503d11 (patch)
tree906d6d90fa94cfa2c83172b8dd43abdbe3375f8e
parent964cc5ed63dc2897c01784ace55a82d05785b55d (diff)
downloadkernel_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.c34
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);
- }
}
}