[CRIU] [PATCH 1/3] devmap: Introduce --device-map argument
Pavel Emelyanov
xemul at parallels.com
Wed Nov 25 01:15:52 PST 2015
On 11/24/2015 01:12 PM, Cyrill Gorcunov wrote:
> We will need it when migration causes device numbers
> being changed and we need to proceed on new hardware.
>
> At the moment this is needed for block devices.
>
> https://jira.sw.ru/PSBM-41357
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
> Documentation/criu.txt | 4 ++++
> crtools.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
> include/cr_options.h | 2 ++
> 3 files changed, 54 insertions(+)
>
> diff --git a/Documentation/criu.txt b/Documentation/criu.txt
> index 652706ee1aaa..c5dd4e56746e 100644
> --- a/Documentation/criu.txt
> +++ b/Documentation/criu.txt
> @@ -272,6 +272,10 @@ The '<mode>' may be one of below.
> These flags enable external shared or slave mounts to be resolved
> automatically when '*--ext-mount-map auto*' is passed.
>
> +*--device-map* '<A>'*:*'<B>'[,'<C>'*:*'<D>']::
> + Specify device mappings when migrating from one environment
> + to another. Currently used for block devices.
So this is restore-only option, isn't it? Why not make it like --ext-mount-map
that would allow to replace one ID with another on dump too?
> +
> *--auto-dedup*::
> As soon as a page is restored it get punched out from image.
>
> diff --git a/crtools.c b/crtools.c
> index d3812a18f4f0..8a51d205d4d5 100644
> --- a/crtools.c
> +++ b/crtools.c
> @@ -190,6 +190,48 @@ static size_t parse_size(char *optarg)
> return (size_t)atol(optarg);
> }
>
> +static int parse_device_map(struct cr_options *opts, char *optarg)
> +{
> + size_t nr_alloc = 0, nr_devmap = 0;
> + unsigned int *devmap = NULL;
> + char *p = optarg;
> + int ret = -1;
> +
> + if (!optarg)
> + return -EINVAL;
> +
> + while (p) {
> + unsigned int s, d;
> + char *at;
> +
> + if (sscanf(p, "%u:%u", &s, &d) != 2)
> + goto out;
> +
> + if (nr_alloc <= nr_devmap) {
> + nr_alloc += 8;
> + if (xrealloc_safe(&devmap, sizeof(*devmap) * nr_alloc))
> + goto out;
> + }
> +
> + devmap[nr_devmap + 0] = s;
> + devmap[nr_devmap + 1] = d;
> +
> + nr_devmap += 2;
> +
> + at = strchr(p, ',');
> + p = at ? at + 1 : NULL;
> + }
> +
> + opts->devmap = devmap;
> + opts->nr_devmap = nr_devmap;
> +
> + devmap = NULL;
> + ret = 0;
> +out:
> + xfree(devmap);
> + return ret;
> +}
> +
> int main(int argc, char *argv[], char *envp[])
> {
> pid_t pid = 0, tree_id = 0;
> @@ -253,6 +295,7 @@ int main(int argc, char *argv[], char *envp[])
> { "freeze-cgroup", required_argument, 0, 1068 },
> { "ghost-limit", required_argument, 0, 1069 },
> { "irmap-scan-path", required_argument, 0, 1070 },
> + { "device-map", required_argument, 0, 1071 },
> { },
> };
>
> @@ -498,6 +541,10 @@ int main(int argc, char *argv[], char *envp[])
> if (irmap_scan_path_add(optarg))
> return -1;
> break;
> + case 1071:
> + if (parse_device_map(&opts, optarg))
> + goto bad_arg;
> + break;
> case 'M':
> {
> char *aux;
> @@ -747,6 +794,7 @@ usage:
> " --enable-fs FSNAMES a comma separated list of filesystem names or \"all\".\n"
> " force criu to (try to) dump/restore these filesystem's\n"
> " mountpoints even if fs is not supported.\n"
> +" --device-map a:b[,..] a comma separated colon splitted device mapping pairs.\n"
> "\n"
> "* Logging:\n"
> " -o|--log-file FILE log file name\n"
> diff --git a/include/cr_options.h b/include/cr_options.h
> index eac7283a4821..1451b386cce1 100644
> --- a/include/cr_options.h
> +++ b/include/cr_options.h
> @@ -95,6 +95,8 @@ struct cr_options {
> bool overlayfs;
> size_t ghost_limit;
> struct list_head irmap_scan_paths;
> + unsigned int *devmap;
> + size_t nr_devmap;
> };
>
> extern struct cr_options opts;
>
More information about the CRIU
mailing list