From dfef4e05d5b8eb7097c15dc5dce181140b5da406 Mon Sep 17 00:00:00 2001 From: Andrew Vagin Date: Fri, 9 Oct 2015 14:06:00 +0300 Subject: [PATCH] mnt: Fix slave mounts order estimation in can_mount_now For slave mount we need to make sure that all childrent mountpoints of the master peer is mounted before we can proceed otherwise there gonna be duplicated mountpoints after the restore. https://jira.sw.ru/browse/PSBM-39957 Signed-off-by: Andrew Vagin Signed-off-by: Cyrill Gorcunov Signed-off-by: Pavel Emelyanov --- mount.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/mount.c b/mount.c index deb641fe6..ab74b6bc5 100644 --- a/mount.c +++ b/mount.c @@ -2072,8 +2072,23 @@ static bool can_mount_now(struct mount_info *mi) if (mi->external) return true; - if (mi->master_id && mi->bind == NULL) - return false; + /* + * We're the slave peer: + * - Make sure the master peer is already mounted + * - Make sure all children is mounted as well to + * eliminame mounts duplications + */ + if (mi->master_id) { + struct mount_info *c; + + if (mi->bind == NULL) + return false; + + list_for_each_entry(c, &mi->bind->children, siblings) { + if (!c->mounted) + return false; + } + } if (!fsroot_mounted(mi) && (mi->bind == NULL && !mi->need_plugin && !mi->external)) return false; @@ -2090,9 +2105,6 @@ static bool can_mount_now(struct mount_info *mi) list_for_each_entry(n, &p->mnt_share, mnt_share) if (!n->mounted) return false; - list_for_each_entry(n, &p->mnt_slave_list, mnt_slave) - if (!n->mounted) - return false; } }