[CRIU] [PATCH] mount: detect the newinstance option for devpts
Pavel Emelyanov
xemul at parallels.com
Tue Apr 1 11:19:33 PDT 2014
On 04/01/2014 02:44 PM, Andrey Vagin wrote:
> The devpts instance was mounted w/o the newinstance option if,
> the device number is equal to the root /dev/pts.
>
> I think this condition is strong enough to not mount devpts in a
> temporary place.
>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> include/fs-magic.h | 4 ++++
> mount.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 61 insertions(+)
>
> diff --git a/include/fs-magic.h b/include/fs-magic.h
> index d31a939..9db3ee9 100644
> --- a/include/fs-magic.h
> +++ b/include/fs-magic.h
> @@ -29,4 +29,8 @@
> # define SOCKFS_MAGIC 0x534f434b
> #endif
>
> +#ifndef DEVPTS_SUPER_MAGIC
> +#define DEVPTS_SUPER_MAGIC 0x1cd1
> +#endif
> +
> #endif /* __CR_FS_MAGIC_H__ */
> diff --git a/mount.c b/mount.c
> index 10d1378..71fbf97 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -23,6 +23,7 @@
> #include "proc_parse.h"
> #include "image.h"
> #include "namespaces.h"
> +#include "fs-magic.h"
> #include "protobuf.h"
> #include "protobuf/mnt.pb-c.h"
>
> @@ -578,6 +579,61 @@ out:
> return NULL;
> }
>
> +/* Is it mounted w or w/o the newinstance option */
> +static int devpts_dump(struct mount_info *pm)
> +{
> + static const char newinstance[] = ",newinstance";
> + static struct stat host_st = {};
> + struct stat st;
> + DIR *fdir = NULL;
> + char *buf;
> + int len;
> +
> + if (host_st.st_dev == 0) {
> + struct statfs fst;
> +
> + if (statfs("/dev/pts", &fst)) {
> + pr_perror("Unable to statefs /dev/pts");
> + return -1;
> + }
> + if (fst.f_type != DEVPTS_SUPER_MAGIC) {
> + pr_err("devpts isn't mount on the host\n");
> + return -1;
> + }
> +
> + /* The root /dev/pts is mounted w/o newinstance, isn't it? */
> + if (stat("/dev/pts", &host_st)) {
> + pr_perror("Unable to state /dev/pts");
> + return -1;
> + }
> + }
The host.bla-bla-bla should be in kerndat.c
> +
> + fdir = open_mountpoint(pm);
> + if (fdir == NULL)
> + return -1;
> +
> + if (fstat(dirfd(fdir), &st)) {
> + pr_perror("Unable to statfs %d:%s",
> + pm->mnt_id, pm->mountpoint);
> + close_mountpoint(fdir);
> + return -1;
> + }
> + close_mountpoint(fdir);
> +
> + if (host_st.st_dev == st.st_dev)
> + return 0;
> +
> + len = strlen(pm->options);
> + buf = xrealloc(pm->options, len + sizeof(newinstance));
> + if (buf == NULL)
> + return -1;
> + memcpy(buf, newinstance, sizeof(newinstance));
> +
> + pm->options = buf;
> +
> + return 0;
> +}
> +
> static int tmpfs_dump(struct mount_info *pm)
> {
> int ret = -1;
> @@ -694,6 +750,7 @@ static struct fstype fstypes[] = {
> .restore = tmpfs_restore,
> }, {
> .name = "devpts",
> + .dump = devpts_dump,
> .code = FSTYPE__DEVPTS,
> }, {
> .name = "simfs",
>
More information about the CRIU
mailing list