[CRIU] [PATCH 1/3] mount: cut a common part of sources for bind-mounts
Andrew Vagin
avagin at parallels.com
Thu Apr 10 04:25:37 PDT 2014
On Thu, Apr 10, 2014 at 03:05:28PM +0400, Pavel Emelyanov wrote:
> On 04/10/2014 02:52 PM, Andrey Vagin wrote:
>
> A couple of examples and "What for?" answer would form nice comment.
The source of the root mount may be not equal to "/" and we need to take
this fact into account, when we bind-mount it to somewhere.
For example:
11877 ? Ss 0:00 ./bind-mount --pidfile=bind-mount.pid --outfile=bind-mount.out --dirname=bind-mount.test
11880 ? Ss 0:00 \_ ./bind-mount --pidfile=bind-mount.pid --outfile=bind-mount.out --dirname=bind-mount.test
[root at avagin-fc19-cr crtools]# cat /proc/11880/mountinfo
68 42 8:3 /root/git/crtools/test / rw,relatime - ext4 /dev/sda3 rw,data=ordered
43 68 0:33 / /proc rw,relatime - proc proc rw
44 68 0:34 / /dev/pts rw,relatime - devpts pts rw,mode=666,ptmxmode=666
45 68 8:3 /root/git/crtools/test/zdtm/live/static/bind-mount.test/test /zdtm/live/static/bind-mount.test/bind rw,relatime - ext4 /dev/sda3 rw,data=ordered
The 45 mount is bind-mount of the 68 mount.
mi(45)->root = /root/git/crtools/test/zdtm/live/static/bind-mount.test/test
mi(68)->root = /root/git/crtools/test
so the comman part is "/root/git/crtools/test" and the command is
mount --bind /zdtm/live/static/bind-mount.test/test /zdtm/live/static/bind-mount.test/bind
>
> > Signed-off-by: Andrey Vagin <avagin at openvz.org>
> > ---
> > mount.c | 15 +++++++++++++--
> > 1 file changed, 13 insertions(+), 2 deletions(-)
> >
> > diff --git a/mount.c b/mount.c
> > index 3a37033..c7fba51 100644
> > --- a/mount.c
> > +++ b/mount.c
> > @@ -1137,11 +1137,22 @@ static int restore_ext_mount(struct mount_info *mi)
> >
> > static int do_bind_mount(struct mount_info *mi)
> > {
> > - char rpath[PATH_MAX];
> > bool shared = mi->shared_id && mi->shared_id == mi->bind->shared_id;
> >
> > if (!mi->need_plugin) {
> > - snprintf(rpath, sizeof(rpath), "%s%s", mi->bind->mountpoint, mi->root);
> > + char rpath[PATH_MAX];
> > + int tok = 0;
> > +
> > + /* Cut common part of root */
> > + while (mi->root[tok] == mi->bind->root[tok]) {
> > + tok++;
> > + if (mi->bind->root[tok] == '\0')
> > + break;
> > + BUG_ON(mi->root[tok] == '\0');
> > + }
> > +
> > + snprintf(rpath, sizeof(rpath), "%s/%s",
> > + mi->bind->mountpoint, mi->root + tok);
> > pr_info("\tBind %s to %s\n", rpath, mi->mountpoint);
> >
> > if (mount(rpath, mi->mountpoint, NULL,
> >
>
>
More information about the CRIU
mailing list