[CRIU] [PATCH] Extend the parser to accept negative options

Dmitry Safonov 0x7f454c46 at gmail.com
Wed Mar 29 17:10:40 PDT 2017


2017-03-30 2:51 GMT+03:00 Kir Kolyshkin <kir at openvz.org>:
> On 03/28/2017 12:24 PM, Veronika Kabatova wrote:
>>
>> Introducing negative options for true / false values. The original
>> getopt_long parser is kept since it is able to set flag-like values.
>> The type of the options needed to be changed to integers for getopt_long
>> to accept flag-like value settings (as per getopt_long documentation,
>> the address of integer variable has to be passed).
>>
>> Corresponding negative options are not added for deprecated options.
>>
>> This patch is a preparation for the addition of configuration files
>> (GitHub issue #278). General idea of this feature is to have global
>> configuration files in /etc/criu.d/ directory and user-specific
>> configuration files in $HOME/.criu.d/ directory, with the possibility
>> of specifying a chosen file to be used (default files will be used if
>> none is specified, or none in case the default ones are not present,
>> to not break compatibility). The options in configuration files should
>> be possible to be overriden by the options specified on command line,
>> hence the negative options addition.
>>
>> The whole feature of configuration files will remove the need of
>> specifying all the options on command line, with the possibility of
>> reusing a file for different use case with only overriding some of the
>> values specified there.
>>
>> In case both types of option (negative and positive) are passed, the
>> later one will be applied -- this works with the philosophy of
>> overriding the "earlier" options from configuration files.
>>
>> Signed-off-by: Veronika Kabatova <vkabatov at redhat.com>
>> ---
>>   Documentation/criu.txt    | 110 +++++++++++-----------
>>   criu/crtools.c            | 231
>> +++++++++++++++++++++-------------------------
>>   criu/include/cr_options.h |  42 ++++-----
>>   criu/include/file-lock.h  |   3 +-
>>   criu/include/files.h      |   1 +
>>   criu/include/sk-inet.h    |   6 +-
>>   criu/include/tty.h        |   3 +-
>>   7 files changed, 191 insertions(+), 205 deletions(-)
>>
>> diff --git a/Documentation/criu.txt b/Documentation/criu.txt
>> index 1d64f7f..17bd1fa 100644
>> --- a/Documentation/criu.txt
>> +++ b/Documentation/criu.txt
>> @@ -54,17 +54,18 @@ The following levels are available:
>>   *-o*, *--log-file* 'file'::
>>       Write logging messages to 'file'.
>>   -*--log-pid*::
>> -    Write separate logging files per each pid.
>> +*--[no-]log-pid*::
>> +    [Don't] write separate logging files per each pid.
>>   -*--display-stats*::
>> +*--[no-]display-stats*::
>>       During dump as well as during restore *criu* collects information
>>       like the time required to dump or restore the process or the
>>       number of pages dumped or restored. This information is always
>>       written to the files 'stats-dump' and 'stats-restore' and can
>>       be easily displayed using *crit*. The option *--display-stats*
>>       additionally prints out this information on the console at the end
>> -    of a dump or a restore.
>> +    of a dump or a restore, using *--no-display-stats* disables this in
>
>
> s/,/;/
>
>> +    case it was previously enabled.
>>     *-D*, *--images-dir* 'path'::
>>       Use 'path' as a base directory where to look for sets of image
>> files.
>> @@ -131,9 +132,9 @@ memory changes since the previous *pre-dump*. Note
>> that during this
>>   procedure. *pre-dump* requires at least *-t* option (see *dump* below).
>>   In addition, *page-server* options may be specified.
>>   -*--track-mem*::
>> -    Turn on memory changes tracker in the kernel. If the option is
>> -    not passed the memory tracker get turned on implicitly.
>> +*--[no-]track-mem*::
>> +    Turn on [off if enabled] memory changes tracker in the kernel. If no
>
>
> Just say "Turn on/off".
>
>
>> +    option is passed the memory tracker get turned on implicitly.
>>     *dump*
>>   ~~~~~~
>> @@ -250,37 +251,40 @@ For example, the command line for the above example
>> should look like this:
>>       a predefined controller property with the new one shipped. If the
>> option
>>       is not used, the predefined properties are merged with the provided
>> ones.
>>   -*--tcp-established*::
>> -    Checkpoint established TCP connections.
>> +*--[no-]tcp-established*::
>> +    [Don't] checkpoint established TCP connections.
>>   -*--skip-in-flight*::
>> +*--[no-]skip-in-flight*::
>>       This option skips in-flight TCP connections. If any TCP connections
>>       that are not yet completely established are found, *criu* ignores
>>       these connections, rather than errors out.
>>       The TCP stack on the client side is expected to handle the
>>       re-connect gracefully.
>> +    The *--no-skip-in-flight* option disables the skipping in case it
>> +    was previously enabled.
>>   -*--evasive-devices*::
>> -    Use any path to a device file if the original one is inaccessible.
>> +*--[no-]evasive-devices*::
>> +    [Don't] use any path to a device file if the original one is
>> inaccessible.
>>   -*--page-server*::
>> -    Send pages to a page server (see the *page-server* command).
>> +*--[no-]page-server*::
>> +    [Don't] end pages to a page server (see the *page-server* command).
>
>
> s/end/send/
>
>
>>   -*--force-irmap*::
>> -    Force resolving names for inotify and fsnotify watches.
>> +*--[no-]force-irmap*::
>> +    [Don't] force resolving names for inotify and fsnotify watches.
>>   -*--auto-dedup*::
>> -    Deduplicate "old" data in pages images of previous *dump*. This
>> option
>> -    implies incremental *dump* mode (see the *pre-dump* command).
>> +*--[no-]auto-dedup*::
>> +    [Don't] deduplicate "old" data in pages images of previous *dump*.
>> This
>> +    option implies incremental *dump* mode (see the *pre-dump* command).
>>   -*-l*, *--file-locks*::
>> -    Dump file locks. It is necessary to make sure that all file lock
>> users
>> -    are taken into dump, so it is only safe to use this for enclosed
>> containers
>> -    where locks are not held by any processes outside of dumped process
>> tree.
>> +*-l*, *--[no-]file-locks*::
>> +    [Don't] dump file locks. It is necessary to make sure that all file
>> lock
>> +    users are taken into dump, so it is only safe to use this for
>> enclosed
>> +    containers where locks are not held by any processes outside of
>> dumped
>> +    process tree.
>>   -*--link-remap*::
>> -    Allows to link unlinked files back, if possible (modifies filesystem
>> -    during *restore*).
>> +*--[no-]link-remap*::
>> +    Allows [disallows] to link unlinked files back, if possible (modifies
>> +    filesystem during *restore*).
>>     *--ghost-limit* 'size'::
>>       Set the maximum size of deleted file to be carried inside image.
>> @@ -289,9 +293,9 @@ For example, the command line for the above example
>> should look like this:
>>       'size' may be postfixed with a *K*, *M* or *G*, which stands for
>> kilo-,
>>       mega, and gigabytes, accordingly.
>>   -*-j*, *--shell-job*::
>> -    Allow one to dump shell jobs. This implies the restored task will
>> -    inherit session and process group ID from the *criu* itself.
>> +*-j*, *--[no-]shell-job*::
>> +    Allow [disallows] one to dump shell jobs. This implies the restored
>> task
>> +    will inherit session and process group ID from the *criu* itself.
>>       This option also allows to migrate a single external tty connection,
>>       to migrate applications like *top*. If used with *dump* command,
>>       it must be specified with *restore* as well.
>> @@ -340,15 +344,15 @@ The 'resource' argument can be one of the following:
>>   Note that square brackets used in this option arguments are literals and
>>   usually need to be escaped from shell.
>>   -*-d*, *--restore-detached*::
>> -    Detach *criu* itself once restore is complete.
>> +*-d*, *--[no-]restore-detached*::
>> +    [Don't] detach *criu* itself once restore is complete.
>>     *-s*, *--leave-stopped*::
>>       Leave tasks in stopped state after restore (rather than resuming
>>       their execution).
>>   -*-S*, *--restore-sibling*::
>> -    Restore root task as a sibling (makes sense only with
>> +*-S*, *--[no-]restore-sibling*::
>> +    [Don't] restore root task as a sibling (makes sense only with
>>       *--restore-detached*).
>>     *-r*, *--root* 'path'::
>> @@ -412,23 +416,24 @@ The 'mode' may be one of the following:
>>       Change the root cgroup the controller will be installed into. No
>> controller
>>       means that root is the default for all controllers not specified.
>>   -*--tcp-established*::
>> -    Restore previously dumped established TCP connections. This implies
>> that
>> -    the network has been locked between *dump* and *restore* phases so
>> other
>> -    side of a connection simply notice a kind of lag.
>> +*--[no-]tcp-established*::
>> +    [Don't] restore previously dumped established TCP connections. This
>> implies
>> +    that the network has been locked between *dump* and *restore* phases
>> so
>> +    other side of a connection simply notice a kind of lag.
>>     *--veth-pair* 'IN'*=*'OUT'::
>>       Correspondence between outside and inside names of veth devices.
>>   -*-l*, *--file-locks*::
>> -    Restore file locks from the image.
>> +*-l*, *--[no-]file-locks*::
>> +    [Don't] restore file locks from the image.
>>   -*--auto-dedup*::
>> -    As soon as a page is restored it get punched out from image.
>> +*--[no-]auto-dedup*::
>> +    As soon as a page is restored it gets punched out from image. Use
>> +    *--no-auto-dedup* to disable this in case it was enabled previously.
>>   -*-j*, *--shell-job*::
>> -    Restore shell jobs, in other words inherit session and process group
>> -    ID from the criu itself.
>> +*-j*, *--[no-]shell-job*::
>> +    [Don't] restore shell jobs, in other words inherit session and
>> process
>> +    group ID from the criu itself.
>>     *--cpu-cap* ['cap'[,'cap'...]]::
>>       Specify CPU capabilities to be present on the CPU the process is
>> @@ -474,10 +479,11 @@ during *dump*, and images are migrated to a less
>> capable CPU and are
>>   to be restored. By default, *criu* shows an error that CPU capabilities
>>   are not adequate, but this can be suppressed by using *--cpu-cap=none*.
>>   -*--weak-sysctls*::
>> +*--[no-]weak-sysctls*::
>>      Silently skip restoring sysctls that are not available. This allows
>>      to restore on an older kernel, or a kernel configured without some
>> -   options.
>> +   options. Using *--no-weak-sysctls* disables silent skipping in case it
>> +   was previously enabled.
>>     *check*
>>   ~~~~~~~
>> @@ -513,11 +519,11 @@ Missing Category 2 and 3 features cause *criu* to
>> print "Looks good but
>>   Without any options, *criu check* checks Category 1 features. This
>>   behavior can be changed by using the following options:
>>   -*--extra*::
>> -    Check kernel support for Category 2 features.
>> +*--[no-]extra*::
>> +    [Don't] check kernel support for Category 2 features.
>>   -*--experimental*::
>> -    Check kernel support for Category 3 features.
>> +*--[no-]experimental*::
>> +    [Don't] check kernel support for Category 3 features.
>>     *--all*::
>>       Check kernel support for Category 1, 2, and 3 features.
>> @@ -530,8 +536,8 @@ behavior can be changed by using the following
>> options:
>>   ~~~~~~~~~~~~~
>>   Launches *criu* in page server mode.
>>   -*--daemon*::
>> -    Runs page server as a daemon (background process).
>> +*--[no-]daemon*::
>> +    [Don't] run page server as a daemon (background process).
>>     *--status_fd*::
>>       Write \\0 to the FD and close it once page-server is ready to handle
>
>
> I have an idea! Instead of adding and describing "no" to every option,
> Why don't you say (somewhere at the beginning of OPTIONS)
> that most of the long binary options can be prefixed with *--no-*
> to negate the option meaning (example: --track-mem and --no-track-mem).
>
>> diff --git a/criu/crtools.c b/criu/crtools.c
>> index 5a039a8..4af29fa 100644
>> --- a/criu/crtools.c
>> +++ b/criu/crtools.c
>> @@ -226,9 +226,12 @@ int main(int argc, char *argv[], char *envp[])
>>                 { "pid",                        required_argument,      0,
>> 'p'  },
>>                 { "leave-stopped",              no_argument,            0,
>> 's'  },
>>                 { "leave-running",              no_argument,            0,
>> 'R'  },
>> -               { "restore-detached",           no_argument,            0,
>> 'd'  },
>> -               { "restore-sibling",            no_argument,            0,
>> 'S'  },
>> -               { "daemon",                     no_argument,            0,
>> 'd'  },
>> +               { "restore-detached",           no_argument,
>> &opts.restore_detach, true      },
>> +               { "no-restore-detached",        no_argument,
>> &opts.restore_detach, false     },
>
>
> A simple macro can be written to generate these two lines for
> every binary option, as the only things different between the first
> and the second lines are "no-" prefix and true vs false value.
>
> Ditto for all the other params modified in a similar way.
>
>
>> +               { "restore-sibling",            no_argument,
>> &opts.restore_sibling, true     },
>> +               { "no-restore-sibling",         no_argument,
>> &opts.restore_sibling, false    },
>> +               { "daemon",                     no_argument,
>> &opts.restore_detach, true      },
>> +               { "no-daemon",                  no_argument,
>> &opts.restore_detach, false     },
>>                 { "contents",                   no_argument,            0,
>> 'c'  },
>>                 { "file",                       required_argument,      0,
>> 'f'  },
>>                 { "fields",                     required_argument,      0,
>> 'F'  },
>> @@ -239,27 +242,37 @@ int main(int argc, char *argv[], char *envp[])
>>                 { "root",                       required_argument,      0,
>> 'r'  },
>>                 { USK_EXT_PARAM,                optional_argument,      0,
>> 'x'  },
>>                 { "help",                       no_argument,            0,
>> 'h'  },
>> -               { SK_EST_PARAM,                 no_argument,            0,
>> 1042 },
>> +               { SK_EST_PARAM,                 no_argument,
>> &opts.tcp_established_ok, true  },
>> +               { SK_NO_EST_PARAM,              no_argument,
>> &opts.tcp_established_ok, false },
>>                 { "close",                      required_argument,      0,
>> 1043 },
>> -               { "log-pid",                    no_argument,            0,
>> 1044 },
>> +               { "log-pid",                    no_argument,
>> &opts.log_file_per_pid, true    },
>> +               { "no-log-pid",                 no_argument,
>> &opts.log_file_per_pid, false   },
>>                 { "version",                    no_argument,            0,
>> 'V'  },
>> -               { "evasive-devices",            no_argument,            0,
>> 1045 },
>> +               { "evasive-devices",            no_argument,
>> &opts.evasive_devices, true     },
>> +               { "no-evasive-devices",         no_argument,
>> &opts.evasive_devices, false    },
>>                 { "pidfile",                    required_argument,      0,
>> 1046 },
>>                 { "veth-pair",                  required_argument,      0,
>> 1047 },
>>                 { "action-script",              required_argument,      0,
>> 1049 },
>> -               { LREMAP_PARAM,                 no_argument,            0,
>> 1041 },
>> -               { OPT_SHELL_JOB,                no_argument,            0,
>> 'j'  },
>> -               { OPT_FILE_LOCKS,               no_argument,            0,
>> 'l'  },
>> -               { "page-server",                no_argument,            0,
>> 1050 },
>> +               { LREMAP_PARAM,                 no_argument,
>> &opts.link_remap_ok, true       },
>> +               { NO_LREMAP_PARAM,              no_argument,
>> &opts.link_remap_ok, false      },
>
>
> The above suggestion will also save you from introducing such additional
> defines.
>
>
>> +               { OPT_SHELL_JOB,                no_argument,
>> &opts.shell_job, true           },
>> +               { OPT_NO_SHELL_JOB,             no_argument,
>> &opts.shell_job, false          },
>> +               { OPT_FILE_LOCKS,               no_argument,
>> &opts.handle_file_locks, true   },
>> +               { OPT_NO_FILE_LOCKS,            no_argument,
>> &opts.handle_file_locks, false  },
>> +               { "page-server",                no_argument,
>> &opts.use_page_server, true     },
>> +               { "no-page-server",             no_argument,
>> &opts.use_page_server, false    },
>>                 { "address",                    required_argument,      0,
>> 1051 },
>>                 { "port",                       required_argument,      0,
>> 1052 },
>>                 { "prev-images-dir",            required_argument,      0,
>> 1053 },
>>                 { "ms",                         no_argument,            0,
>> 1054 },
>> -               { "track-mem",                  no_argument,            0,
>> 1055 },
>> -               { "auto-dedup",                 no_argument,            0,
>> 1056 },
>> +               { "track-mem",                  no_argument,
>> &opts.track_mem, true           },
>> +               { "no-track-mem",               no_argument,
>> &opts.track_mem, false          },
>> +               { "auto-dedup",                 no_argument,
>> &opts.auto_dedup, true          },
>> +               { "no-auto-dedup",              no_argument,
>> &opts.auto_dedup, false         },
>>                 { "libdir",                     required_argument,      0,
>> 'L'  },
>>                 { "cpu-cap",                    optional_argument,      0,
>> 1057 },
>> -               { "force-irmap",                no_argument,            0,
>> 1058 },
>> +               { "force-irmap",                no_argument,
>> &opts.force_irmap, true         },
>> +               { "no-force-irmap",             no_argument,
>> &opts.force_irmap, false        },
>>                 { "ext-mount-map",              required_argument,      0,
>> 'M'  },
>>                 { "exec-cmd",                   no_argument,            0,
>> 1059 },
>>                 { "manage-cgroups",             optional_argument,      0,
>> 1060 },
>> @@ -268,8 +281,8 @@ int main(int argc, char *argv[], char *envp[])
>>                 { "feature",                    required_argument,      0,
>> 1063 },
>>                 { "skip-mnt",                   required_argument,      0,
>> 1064 },
>>                 { "enable-fs",                  required_argument,      0,
>> 1065 },
>> -               { "enable-external-sharing",    no_argument,            0,
>> 1066 },
>> -               { "enable-external-masters",    no_argument,            0,
>> 1067 },
>> +               { "enable-external-sharing",    no_argument,
>> &opts.enable_external_sharing, true     },
>> +               { "enable-external-masters",    no_argument,
>> &opts.enable_external_masters, true     },
>>                 { "freeze-cgroup",              required_argument,      0,
>> 1068 },
>>                 { "ghost-limit",                required_argument,      0,
>> 1069 },
>>                 { "irmap-scan-path",            required_argument,      0,
>> 1070 },
>> @@ -278,19 +291,26 @@ int main(int argc, char *argv[], char *envp[])
>>                 { "external",                   required_argument,      0,
>> 1073 },
>>                 { "empty-ns",                   required_argument,      0,
>> 1074 },
>>                 { "lazy-pages",                 no_argument,            0,
>> 1076 },
>> -               { "extra",                      no_argument,            0,
>> 1077 },
>> -               { "experimental",               no_argument,            0,
>> 1078 },
>> +               { "extra",                      no_argument,
>> &opts.check_extra_features, true        },
>> +               { "no-extra",                   no_argument,
>> &opts.check_extra_features, false       },
>> +               { "experimental",               no_argument,
>> &opts.check_experimental_features, true },
>> +               { "no-experimental",            no_argument,
>> &opts.check_experimental_features, false},
>>                 { "all",                        no_argument,            0,
>> 1079 },
>>                 { "cgroup-props",               required_argument,      0,
>> 1080 },
>>                 { "cgroup-props-file",          required_argument,      0,
>> 1081 },
>>                 { "cgroup-dump-controller",     required_argument,      0,
>> 1082 },
>> -               { SK_INFLIGHT_PARAM,            no_argument,            0,
>> 1083 },
>> -               { "deprecated",                 no_argument,            0,
>> 1084 },
>> +               { SK_INFLIGHT_PARAM,            no_argument,
>> &opts.tcp_skip_in_flight, true  },
>> +               { SK_NO_INFLIGHT_PARAM,         no_argument,
>> &opts.tcp_skip_in_flight, false },
>> +               { "deprecated",                 no_argument,
>> &opts.deprecated_ok, true       },
>> +               { "no-deprecated",              no_argument,
>> &opts.deprecated_ok, false      },
>>                 { "check-only",                 no_argument,            0,
>> 1085 },
>> -               { "display-stats",              no_argument,            0,
>> 1086 },
>> -               { "weak-sysctls",               no_argument,            0,
>> 1087 },
>> +               { "display-stats",              no_argument,
>> &opts.display_stats, true       },
>> +               { "no-display-stats",           no_argument,
>> &opts.display_stats, false      },
>> +               { "weak-sysctls",               no_argument,
>> &opts.weak_sysctls, true        },
>> +               { "no-weak-sysctls",            no_argument,
>> &opts.weak_sysctls, false       },
>>                 { "status-fd",                  required_argument,      0,
>> 1088 },
>> -               { "remote",                     no_argument,            0,
>> 1089 },
>> +               { "remote",                     no_argument,
>> &opts.remote, true              },
>> +               { "no-remote",                  no_argument,
>> &opts.remote, false             },
>>                 { },
>>         };
>>   @@ -330,6 +350,8 @@ int main(int argc, char *argv[], char *envp[])
>>                 opt = getopt_long(argc, argv, short_opts, long_opts,
>> &idx);
>>                 if (opt == -1)
>>                         break;
>> +               if (!opt)
>> +                       continue;
>>                 switch (opt) {
>>                 case 's':
>> @@ -394,14 +416,6 @@ int main(int argc, char *argv[], char *envp[])
>>                         } else
>>                                 log_level++;
>>                         break;
>> -               case 1041:
>> -                       pr_info("Will allow link remaps on FS\n");
>> -                       opts.link_remap_ok = true;
>> -                       break;
>> -               case 1042:
>> -                       pr_info("Will dump TCP connections\n");
>> -                       opts.tcp_established_ok = true;
>> -                       break;
>>                 case 1043: {
>>                         int fd;
>>   @@ -410,12 +424,6 @@ int main(int argc, char *argv[], char *envp[])
>>                         close(fd);
>>                         break;
>>                 }
>> -               case 1044:
>> -                       opts.log_file_per_pid = 1;
>> -                       break;
>> -               case 1045:
>> -                       opts.evasive_devices = true;
>> -                       break;
>>                 case 1046:
>>                         opts.pidfile = optarg;
>>                         break;
>> @@ -437,9 +445,6 @@ int main(int argc, char *argv[], char *envp[])
>>                                 return 1;
>>                         break;
>> -               case 1050:
>> -                       opts.use_page_server = true;
>> -                       break;
>>                 case 1051:
>>                         opts.addr = optarg;
>>                         break;
>> @@ -457,12 +462,6 @@ int main(int argc, char *argv[], char *envp[])
>>                 case 1053:
>>                         opts.img_parent = optarg;
>>                         break;
>> -               case 1055:
>> -                       opts.track_mem = true;
>> -                       break;
>> -               case 1056:
>> -                       opts.auto_dedup = true;
>> -                       break;
>>                 case 1057:
>>                         if (parse_cpu_cap(&opts, optarg))
>>                                 goto usage;
>> @@ -520,12 +519,6 @@ int main(int argc, char *argv[], char *envp[])
>>                         if (!add_fsname_auto(optarg))
>>                                 return 1;
>>                         break;
>> -               case 1066:
>> -                       opts.enable_external_sharing = true;
>> -                       break;
>> -               case 1067:
>> -                       opts.enable_external_masters = true;
>> -                       break;
>>                 case 1068:
>>                         opts.freeze_cgroup = optarg;
>>                         break;
>> @@ -577,12 +570,6 @@ int main(int argc, char *argv[], char *envp[])
>>                                 return 1;
>>                         }
>>                         break;
>> -               case 1077:
>> -                       opts.check_extra_features = true;
>> -                       break;
>> -               case 1078:
>> -                       opts.check_experimental_features = true;
>> -                       break;
>>                 case 1079:
>>                         opts.check_extra_features = true;
>>                         opts.check_experimental_features = true;
>> @@ -597,35 +584,12 @@ int main(int argc, char *argv[], char *envp[])
>>                         if (!cgp_add_dump_controller(optarg))
>>                                 return 1;
>>                         break;
>> -               case 1083:
>> -                       pr_msg("Will skip in-flight TCP connections\n");
>> -                       opts.tcp_skip_in_flight = true;
>> -                       break;
>> -               case 1084:
>> -                       pr_msg("Turn deprecated stuff ON\n");
>> -                       opts.deprecated_ok = true;
>> -                       break;
>> -               case 1085:
>> -                       pr_msg("Only checking if requested operation will
>> succeed\n");
>> -                       opts.check_only = true;
>> -                       opts.final_state = TASK_ALIVE;
>
>
> I don't see where are you recreating this removed functionality.

Oh, that's actually, quite nice part of the patch: instead of setting
bools inside of opts by the hands, it passes a pointer as option::flag
to getopt_long(). Though, that could has been described in the
changelog..

>
>
>> -                       break;
>> -               case 1086:
>> -                       opts.display_stats = true;
>> -                       break;
>> -               case 1087:
>> -                       pr_msg("Will skip non-existant sysctls on
>> restore\n");
>> -                       opts.weak_sysctls = true;
>> -                       break;
>>                 case 1088:
>>                         if (sscanf(optarg, "%d", &opts.status_fd) != 1) {
>>                                 pr_err("Unable to parse a value of
>> --status-fd\n");
>>                                 return 1;
>>                         }
>>                         break;
>> -               case 1089:
>> -                       opts.remote = true;
>> -                       break;
>>                 case 'V':
>>                         pr_msg("Version: %s\n", CRIU_VERSION);
>>                         if (strcmp(CRIU_GITID, "0"))
>> @@ -639,6 +603,17 @@ int main(int argc, char *argv[], char *envp[])
>>                 }
>>         }
>>   +     if (opts.deprecated_ok)
>> +               pr_msg("Turn deprecated stuff ON\n");
>> +       if (opts.tcp_skip_in_flight)
>> +               pr_msg("Will skip in-flight TCP connections\n");
>> +       if (opts.tcp_established_ok)
>> +               pr_info("Will dump TCP connections\n");
>> +       if (opts.link_remap_ok)
>> +               pr_info("Will allow link remaps on FS\n");
>> +       if (opts.weak_sysctls)
>> +               pr_msg("Will skip non-existant sysctls on restore\n");
>> +
>>         if (getenv("CRIU_DEPRECATED")) {
>>                 pr_msg("Turn deprecated stuff ON via env\n");
>>                 opts.deprecated_ok = true;
>> @@ -851,29 +826,29 @@ usage:
>>   "Dump/Restore options:\n"
>>   "\n"
>>   "* Generic:\n"
>> -"  -t|--tree PID         checkpoint a process tree identified by PID\n"
>> -"  -d|--restore-detached detach after restore\n"
>> -"  -S|--restore-sibling  restore root task as sibling\n"
>> -"  -s|--leave-stopped    leave tasks in stopped state after checkpoint\n"
>> -"  -R|--leave-running    leave tasks in running state after checkpoint\n"
>> -"  -D|--images-dir DIR   directory for image files\n"
>> -"     --pidfile FILE     write root task, service or page-server pid to
>> FILE\n"
>> -"  -W|--work-dir DIR     directory to cd and write logs/pidfiles/stats
>> to\n"
>> -"                        (if not specified, value of --images-dir is
>> used)\n"
>> -"     --cpu-cap [CAP]    CPU capabilities to write/check. CAP is
>> comma-separated\n"
>> -"                        list of: cpu, fpu, all, ins, none. To disable\n"
>> -"                        a capability, use ^CAP. Empty argument implies
>> all\n"
>> -"     --exec-cmd         execute the command specified after '--' on
>> successful\n"
>> -"                        restore making it the parent of the restored
>> process\n"
>> -"  --freeze-cgroup       use cgroup freezer to collect processes\n"
>> -"  --weak-sysctls        skip restoring sysctls that are not available\n"
>> -"  --lazy-pages          restore pages on demand\n"
>> -"                        this requires running a second instance of
>> criu\n"
>> -"                        in lazy-pages mode: 'criu lazy-pages -D DIR'\n"
>> -"                        --lazy-pages and lazy-pages mode require
>> userfaultfd\n"
>> -"  --check-only          check if checkpointing/restoring will actually
>> work\n"
>> -"                        the process will keep on running and memory
>> pages\n"
>> -"                        will not be dumped\n"
>> +"  -t|--tree PID              checkpoint a process tree identified by
>> PID\n"
>> +"  -d|--[no-]restore-detached [don't] detach after restore\n"
>> +"  -S|--[no-]restore-sibling  [don't] restore root task as sibling\n"
>> +"  -s|--leave-stopped         leave tasks in stopped state after
>> checkpoint\n"
>> +"  -R|--leave-running         leave tasks in running state after
>> checkpoint\n"
>> +"  -D|--images-dir DIR        directory for image files\n"
>> +"     --pidfile FILE          write root task, service or page-server pid
>> to FILE\n"
>> +"  -W|--work-dir DIR          directory to cd and write
>> logs/pidfiles/stats to\n"
>> +"                             (if not specified, value of --images-dir is
>> used)\n"
>> +"     --cpu-cap [CAP]         CPU capabilities to write/check. CAP is
>> comma-separated\n"
>> +"                             list of: cpu, fpu, all, ins, none. To
>> disable\n"
>> +"                             a capability, use ^CAP. Empty argument
>> implies all\n"
>> +"     --exec-cmd              execute the command specified after '--' on
>> successful\n"
>> +"                             restore making it the parent of the
>> restored process\n"
>> +"  --freeze-cgroup            use cgroup freezer to collect processes\n"
>> +"  --[no-]weak-sysctls        [don't] skip restoring sysctls that are not
>> available\n"
>> +"  --lazy-pages               restore pages on demand\n"
>> +"                             this requires running a second instance of
>> criu\n"
>> +"                             in lazy-pages mode: 'criu lazy-pages -D
>> DIR'\n"
>> +"                             --lazy-pages and lazy-pages mode require
>> userfaultfd\n"
>> +"  --check-only               check if checkpointing/restoring will
>> actually work\n"
>> +"                             the process will keep on running and memory
>> pages\n"
>> +"                             will not be dumped\n"
>>   "\n"
>>   "* External resources support:\n"
>>   "  --external RES        dump objects from this list as external
>> resources:\n"
>> @@ -890,21 +865,21 @@ usage:
>>   "                            macvlan[IFNAME]:OUTNAME\n"
>>   "                            mnt[COOKIE]:ROOT\n"
>>   "\n"
>> -"  --remote              dump/restore images directly to/from remote node
>> using\n"
>> -"                        image-proxy/image-cache\n"
>> +"  --[no-]remote             [don't] dump/restore images directly to/from
>> remote node using\n"
>> +"                            image-proxy/image-cache\n"
>>   "* Special resources support:\n"
>> -"     --" SK_EST_PARAM "  checkpoint/restore established TCP
>> connections\n"
>> -"     --" SK_INFLIGHT_PARAM "   skip (ignore) in-flight TCP
>> connections\n"
>> -"  -r|--root PATH        change the root filesystem (when run in mount
>> namespace)\n"
>> -"  --evasive-devices     use any path to a device file if the original
>> one\n"
>> -"                        is inaccessible\n"
>> -"  --link-remap          allow one to link unlinked files back when
>> possible\n"
>> -"  --ghost-limit size    limit max size of deleted file contents inside
>> image\n"
>> -"  --action-script FILE  add an external action script\n"
>> -"  -j|--" OPT_SHELL_JOB "        allow one to dump and restore shell
>> jobs\n"
>> -"  -l|--" OPT_FILE_LOCKS "       handle file locks, for safety, only used
>> for container\n"
>> +"     --[no-]" SK_EST_PARAM "  [don't] checkpoint/restore established TCP
>> connections\n"
>> +"     --[no-]" SK_INFLIGHT_PARAM "   [don't] skip (ignore) in-flight TCP
>> connections\n"
>> +"  -r|--root PATH            change the root filesystem (when run in
>> mount namespace)\n"
>> +"  --[no-]evasive-devices    [don't] use any path to a device file if the
>> original one\n"
>> +"                            is inaccessible\n"
>> +"  --[no-]link-remap         [don't] allow one to link unlinked files
>> back when possible\n"
>> +"  --ghost-limit size        limit max size of deleted file contents
>> inside image\n"
>> +"  --action-script FILE      add an external action script\n"
>> +"  -j|--[no-]" OPT_SHELL_JOB "     [don't] allow one to dump and restore
>> shell jobs\n"
>> +"  -l|--[no-]" OPT_FILE_LOCKS "    [don't] handle file locks, for safety,
>> only used for container\n"
>>   "  -L|--libdir           path to a plugin directory (by default "
>> CR_PLUGIN_DEFAULT ")\n"
>> -"  --force-irmap         force resolving names for inotify/fsnotify
>> watches\n"
>> +"  --[no-]force-irmap        [don't] force resolving names for
>> inotify/fsnotify watches\n"
>>   "  --irmap-scan-path FILE\n"
>>   "                        add a path the irmap hints to scan\n"
>>   "  --manage-cgroups [m]  dump/restore process' cgroups; argument can be
>> one of\n"
>> @@ -949,8 +924,8 @@ usage:
>>   "Check options:\n"
>>   "  Without options, \"criu check\" checks availability of absolutely
>> required\n"
>>   "  kernel features, critical for performing dump and restore.\n"
>> -"  --extra               add check for extra kernel features\n"
>> -"  --experimental        add check for experimental kernel features\n"
>> +"  --[no-]extra          add [remove] check for extra kernel features\n"
>> +"  --[no-]experimental   add [remove] check for experimental kernel
>> features\n"
>>   "  --all                 same as --extra --experimental\n"
>>   "  --feature FEAT        only check a particular feature, one of:"
>>         );
>> @@ -959,28 +934,28 @@ usage:
>>   "\n"
>>   "* Logging:\n"
>>   "  -o|--log-file FILE    log file name\n"
>> -"     --log-pid          enable per-process logging to separate FILE.pid
>> files\n"
>> +"     --[no-]log-pid     [don't] enable per-process logging to separate
>> FILE.pid files\n"
>>   "  -v[v...]            increase verbosity (can use multiple v)\n"
>>   "  -vNUM               set verbosity to NUM (higher level means more
>> output):\n"
>>   "                          -v1 - only errors and messages\n"
>>   "                          -v2 - also warnings (default level)\n"
>>   "                          -v3 - also information messages and
>> timestamps\n"
>>   "                          -v4 - lots of debug\n"
>> -"  --display-stats       print out dump/restore stats\n"
>> +"  --[no-]display-stats  [don't] print out dump/restore stats\n"
>>   "\n"
>>   "* Memory dumping options:\n"
>> -"  --track-mem           turn on memory changes tracker in kernel\n"
>> -"  --prev-images-dir DIR path to images from previous dump (relative to
>> -D)\n"
>> -"  --page-server         send pages to page server (see options below as
>> well)\n"
>> -"  --auto-dedup          when used on dump it will deduplicate \"old\"
>> data in\n"
>> -"                        pages images of previous dump\n"
>> -"                        when used on restore, as soon as page is
>> restored, it\n"
>> -"                        will be punched from the image\n"
>> +"  --[no-]track-mem           turn on [off] memory changes tracker in
>> kernel\n"
>> +"  --prev-images-dir DIR      path to images from previous dump (relative
>> to -D)\n"
>> +"  --[no-]page-server         [don't] send pages to page server (see
>> options below as well)\n"
>> +"  --[no-]auto-dedup          when used on dump it will [won't]
>> deduplicate \"old\" data in\n"
>> +"                                  pages images of previous dump\n"
>> +"                             when used on restore, as soon as page is
>> restored, it\n"
>> +"                                  will [won't] be punched from the
>> image\n"
>>   "\n"
>>   "Page/Service server options:\n"
>>   "  --address ADDR        address of server or service\n"
>>   "  --port PORT           port of page serve or service\n"
>> -"  -d|--daemon           run in the background after creating socket\n"
>> +"  -d|--[no-]daemon      [don't] run in the background after creating
>> socket\n"
>>   "  --status-fd FD        write \\0 to the FD and close it once process
>> is ready\n"
>>   "                        to handle requests\n"
>>   "\n"
>
>
> Please make sure criu --help output fits into 80 columns, otherwise it looks
> ugly on the default 80x24 terminal. Perhaps you can also describe the no-
> prefix separately (same suggestion as for the man page).
>
>
>> diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h
>> index 518d2a3..00e7f9a 100644
>> --- a/criu/include/cr_options.h
>> +++ b/criu/include/cr_options.h
>> @@ -51,21 +51,21 @@ struct cr_options {
>>         int                     final_state;
>>         char                    *show_dump_file;
>>         char                    *show_fmt;
>> -       bool                    check_extra_features;
>> -       bool                    check_experimental_features;
>> +       int                     check_extra_features;
>> +       int                     check_experimental_features;
>>         bool                    show_pages_content;
>>         union {
>> -               bool            restore_detach;
>> +               int             restore_detach;
>>                 bool            daemon_mode;
>>         };
>> -       bool                    restore_sibling;
>> +       int                     restore_sibling;
>>         bool                    ext_unix_sk;
>> -       bool                    shell_job;
>> -       bool                    handle_file_locks;
>> -       bool                    tcp_established_ok;
>> -       bool                    evasive_devices;
>> -       bool                    link_remap_ok;
>> -       bool                    log_file_per_pid;
>> +       int                     shell_job;
>> +       int                     handle_file_locks;
>> +       int                     tcp_established_ok;
>> +       int                     evasive_devices;
>> +       int                     link_remap_ok;
>> +       int                     log_file_per_pid;
>>         bool                    swrk_restore;
>>         char                    *output;
>>         char                    *root;
>> @@ -76,15 +76,15 @@ struct cr_options {
>>         struct list_head        external;
>>         struct list_head        join_ns;
>>         char                    *libdir;
>> -       bool                    use_page_server;
>> +       int                     use_page_server;
>>         unsigned short          port;
>>         char                    *addr;
>>         int                     ps_socket;
>> -       bool                    track_mem;
>> +       int                     track_mem;
>>         char                    *img_parent;
>> -       bool                    auto_dedup;
>> +       int                     auto_dedup;
>>         unsigned int            cpu_cap;
>> -       bool                    force_irmap;
>> +       int                     force_irmap;
>>         char                    **exec_cmd;
>>         unsigned int            manage_cgroups;
>>         char                    *new_global_cg_root;
>> @@ -92,8 +92,8 @@ struct cr_options {
>>         char                    *cgroup_props_file;
>>         struct list_head        new_cgroup_roots;
>>         bool                    autodetect_ext_mounts;
>> -       bool                    enable_external_sharing;
>> -       bool                    enable_external_masters;
>> +       int                     enable_external_sharing;
>> +       int                     enable_external_masters;
>>         bool                    aufs;           /* auto-deteced, not via
>> cli */
>>         bool                    overlayfs;
>>   #ifdef CONFIG_BINFMT_MISC_VIRTUALIZED
>> @@ -106,7 +106,7 @@ struct cr_options {
>>         unsigned int            timeout;
>>         unsigned int            empty_ns;
>>         bool                    lazy_pages;
>> -       bool                    tcp_skip_in_flight;
>> +       int                     tcp_skip_in_flight;
>>         char                    *work_dir;
>>         /*
>> @@ -115,13 +115,13 @@ struct cr_options {
>>          * the deprecated stuff is not working, but it's still possible
>>          * to turn one ON while the code is in.
>>          */
>> -       bool                    deprecated_ok;
>> -       bool                    display_stats;
>> -       bool                    weak_sysctls;
>> +       int                     deprecated_ok;
>> +       int                     display_stats;
>> +       int                     weak_sysctls;
>>         int                     status_fd;
>>         bool                    orphan_pts_master;
>>         bool                    check_only;
>> -       bool                    remote;
>> +       int                     remote;
>>   };
>>     extern struct cr_options opts;
>> diff --git a/criu/include/file-lock.h b/criu/include/file-lock.h
>> index c3f2dab..f9936da 100644
>> --- a/criu/include/file-lock.h
>> +++ b/criu/include/file-lock.h
>> @@ -67,6 +67,7 @@ struct fd_parms;
>>   extern int note_file_lock(struct pid *, int fd, int lfd, struct fd_parms
>> *);
>>   extern int dump_file_locks(void);
>>   -#define OPT_FILE_LOCKS       "file-locks"
>> +#define OPT_FILE_LOCKS         "file-locks"
>> +#define OPT_NO_FILE_LOCKS      "no-file-locks"
>>     #endif /* __FILE_LOCK_H__ */
>> diff --git a/criu/include/files.h b/criu/include/files.h
>> index 5aa6139..1789408 100644
>> --- a/criu/include/files.h
>> +++ b/criu/include/files.h
>> @@ -168,6 +168,7 @@ extern int close_old_fds(void);
>>   #endif
>>     #define LREMAP_PARAM        "link-remap"
>> +#define NO_LREMAP_PARAM "no-link-remap"
>>     extern int shared_fdt_prepare(struct pstree_item *item);
>>   diff --git a/criu/include/sk-inet.h b/criu/include/sk-inet.h
>> index bf6fb1d..cf0fff6 100644
>> --- a/criu/include/sk-inet.h
>> +++ b/criu/include/sk-inet.h
>> @@ -73,8 +73,10 @@ extern void cpt_unlock_tcp_connections(void);
>>   extern int dump_one_tcp(int sk, struct inet_sk_desc *sd);
>>   extern int restore_one_tcp(int sk, struct inet_sk_info *si);
>>   -#define SK_EST_PARAM "tcp-established"
>> -#define SK_INFLIGHT_PARAM "skip-in-flight"
>> +#define SK_EST_PARAM           "tcp-established"
>> +#define SK_NO_EST_PARAM                "no-tcp-established"
>> +#define SK_INFLIGHT_PARAM      "skip-in-flight"
>> +#define SK_NO_INFLIGHT_PARAM   "no-skip-in-flight"
>>     struct task_restore_args;
>>   int prepare_tcp_socks(struct task_restore_args *);
>> diff --git a/criu/include/tty.h b/criu/include/tty.h
>> index 5ad8b09..0a7015c 100644
>> --- a/criu/include/tty.h
>> +++ b/criu/include/tty.h
>> @@ -39,6 +39,7 @@ extern int tty_restore_ctl_terminal(struct file_desc *d,
>> int fd);
>>     extern int devpts_check_bindmount(struct mount_info *m);
>>   -#define OPT_SHELL_JOB        "shell-job"
>> +#define OPT_SHELL_JOB          "shell-job"
>> +#define OPT_NO_SHELL_JOB       "no-shell-job"
>>     #endif /* __CR_TTY_H__ */
>
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu



-- 
             Dmitry


More information about the CRIU mailing list