From 5050c3bbfa04cd3599375382efa73f319d6da0a2 Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Fri, 12 Sep 2014 15:41:00 +0400 Subject: [PATCH] mount: handle a circular reference in mount tree $ cat /proc/self/mountinfo ... 1 1 0:2 / / rw - rootfs rootfs rw,size=373396k,nr_inodes=93349 ... You can see that mnt_id and parent_mnt_id are equals here. This patch interpretes this case as a root mount in a tree. 0'th mount is rootfs, which is mounted in init_mount_tree(). We don't see it in cases when system makes chroot, because of static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) ... /* mountpoints outside of chroot jail will give SEQ_SKIP on this */ err = seq_path_root(m, &mnt_path, &root, " \t\n\\"); Cc: beproject criu Cc: Christopher Covington Reported-by: beproject criu Reviewed-by: Christopher Covington Signed-off-by: Andrey Vagin Signed-off-by: Pavel Emelyanov --- mount.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mount.c b/mount.c index 3896a682f..92a98ef6e 100644 --- a/mount.c +++ b/mount.c @@ -251,7 +251,12 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list) struct mount_info *p; pr_debug("\t\tWorking on %d->%d\n", m->mnt_id, m->parent_mnt_id); - p = __lookup_mnt_id(list, m->parent_mnt_id); + + if (m->mnt_id != m->parent_mnt_id) + p = __lookup_mnt_id(list, m->parent_mnt_id); + else /* a circular mount reference. It's rootfs or smth like it. */ + p = NULL; + if (!p) { /* This should be / */ if (root == NULL && is_root_mount(m)) {