• Pavel Tikhomirov's avatar
    move_mount: allow to add a mount into an existing group · 9ffb14ef
    Pavel Tikhomirov authored
    Previously a sharing group (shared and master ids pair) can be only
    inherited when mount is created via bindmount. This patch adds an
    ability to add an existing private mount into an existing sharing group.
    
    With this functionality one can first create the desired mount tree from
    only private mounts (without the need to care about undesired mount
    propagation or mount creation order implied by sharing group
    dependencies), and next then setup any desired mount sharing between
    those mounts in tree as needed.
    
    This allows CRIU to restore any set of mount namespaces, mount trees and
    sharing group trees for a container.
    
    We have many issues with restoring mounts in CRIU related to sharing
    groups and propagation:
    - reverse sharing groups vs mount tree order requires complex mounts
      reordering which mostly implies also using some temporary mounts
    (please see https://lkml.org/lkml/2021/3/23/569 for more info)
    
    - mount() syscall creates tons of mounts due to propagation
    - mount re-parenting due to propagation
    - "Mount Trap" due to propagation
    - "Non Uniform" propagation, meaning that with different tricks with
      mount order and temporary children-"lock" mounts one can create mount
      trees which can't be restored without those tricks
    (see https://www.linuxplumbersconf.org/event/7/contributions/640/)
    
    With this new functionality we can resolve all the problems with
    propagation at once.
    
    Link: https://lore.kernel.org/r/20210715100714.120228-1-ptikhomirov@virtuozzo.com
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Christian Brauner <christian.brauner@ubuntu.com>
    Cc: Mattias Nissler <mnissler@chromium.org>
    Cc: Aleksa Sarai <cyphar@cyphar.com>
    Cc: Andrei Vagin <avagin@gmail.com>
    Cc: linux-fsdevel@vger.kernel.org
    Cc: linux-api@vger.kernel.org
    Cc: lkml <linux-kernel@vger.kernel.org>
    Co-developed-by: default avatarAndrei Vagin <avagin@gmail.com>
    Acked-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
    Signed-off-by: default avatarPavel Tikhomirov <ptikhomirov@virtuozzo.com>
    Signed-off-by: default avatarAndrei Vagin <avagin@gmail.com>
    Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
    9ffb14ef
namespace.c 110 KB