[CRIU] [PATCH] crtools: close a signal descriptor after passing a preparation stage

Mike Rapoport mike.rapoport at gmail.com
Thu Nov 17 00:30:03 PST 2016


On Thu, Nov 17, 2016 at 9:24 AM, Kir Kolyshkin <kir at openvz.org> wrote:
>
> On 11/16/2016 10:35 PM, Andrei Vagin wrote:
>>
>> From: Andrei Vagin <avagin at virtuozzo.com>
>>
>> This patch adds the --siganl-fd FD option to specify a file descriptor.
>> CRIU will write '\0' to this descriptor and close it after passing
>> a preparation stage.
>>
>> It is alternative way to demonizing a criu process after a preparation
>> stage. It's imposiable to get exit code, if a process has daemonized.
>>
>> The introduced way allows to wait a preparation stage and to get an exit
>> code. It can be easy used from shell and other script languages.
>>
>> Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
>> ---
>>   criu/crtools.c            | 13 ++++++++++++-
>>   criu/include/cr_options.h |  1 +
>>   criu/include/util.h       |  1 +
>>   criu/uffd.c               |  3 +++
>>   criu/util.c               | 18 ++++++++++++++++++
>>   5 files changed, 35 insertions(+), 1 deletion(-)
>>
>> diff --git a/criu/crtools.c b/criu/crtools.c
>> index 710059f..6c468f6 100644
>> --- a/criu/crtools.c
>> +++ b/criu/crtools.c
>> @@ -55,7 +55,9 @@
>>     #include "../soccr/soccr.h"
>>   -struct cr_options opts;
>> +struct cr_options opts = {
>> +       .status_fd = -1,
>> +};
>>     void init_opts(void)
>>   {
>> @@ -285,6 +287,7 @@ int main(int argc, char *argv[], char *envp[])
>>                 { "deprecated",                 no_argument,            0,
>> 1084 },
>>                 { "check-only",                 no_argument,            0,
>> 1085 },
>>                 { "display-stats",              no_argument,            0,
>> 1086 },
>> +               { "status-fd",                  required_argument,      0,
>> 1087 },
>>                 { },
>>         };
>>   @@ -608,6 +611,12 @@ int main(int argc, char *argv[], char *envp[])
>>                 case 1086:
>>                         opts.display_stats = true;
>>                         break;
>> +               case 1087:
>> +                       if (sscanf(optarg, "%d", &opts.status_fd) != 1) {
>> +                               pr_err("Unable to parse a value of
>> --status-fd\n");
>> +                               return 1;
>> +                       }
>> +                       break;
>>                 case 'V':
>>                         pr_msg("Version: %s\n", CRIU_VERSION);
>>                         if (strcmp(CRIU_GITID, "0"))
>> @@ -945,6 +954,8 @@ usage:
>>   "  --address ADDR        address of server or service\n"
>>   "  --port PORT           port of page server\n"
>>   "  -d|--daemon           run in the background after creating socket\n"
>> +"  --status-fd FD        write '\\0' and close FD after passing a
>> preparation\n"
>> +"                        stage\n"
>
>
> "write \0 to and close FD once daemon is ready"

"write \0 to the FD and close it once daemon is ready"

> Also, try hard to fit help text in a single line. If needed, longer
> explanation can be provided in other places like the man page
> and wiki.
>
>
>>   "\n"
>>   "Other options:\n"
>>   "  -h|--help             show this text\n"
>> diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h
>> index e017236..abebe05 100644
>> --- a/criu/include/cr_options.h
>> +++ b/criu/include/cr_options.h
>> @@ -118,6 +118,7 @@ struct cr_options {
>>         bool                    deprecated_ok;
>>         bool                    display_stats;
>>         bool                    check_only;
>> +       int                     status_fd;
>>   };
>>     extern struct cr_options opts;
>> diff --git a/criu/include/util.h b/criu/include/util.h
>> index 8eaee33..ea1053b 100644
>> --- a/criu/include/util.h
>> +++ b/criu/include/util.h
>> @@ -170,6 +170,7 @@ extern int cr_system(int in, int out, int err, char
>> *cmd, char *const argv[], un
>>   extern int cr_system_userns(int in, int out, int err, char *cmd,
>>                                 char *const argv[], unsigned flags, int
>> userns_pid);
>>   extern int cr_daemon(int nochdir, int noclose, int *keep_fd, int
>> close_fd);
>> +extern int close_status_fd(void);
>>   extern int is_root_user(void);
>>     static inline bool dir_dots(const struct dirent *de)
>> diff --git a/criu/uffd.c b/criu/uffd.c
>> index 7efccf5..ba81f4b 100644
>> --- a/criu/uffd.c
>> +++ b/criu/uffd.c
>> @@ -1031,6 +1031,9 @@ int cr_lazy_pages(bool daemon)
>>                 }
>>         }
>>   +     if (close_status_fd())
>> +               return -1;
>> +
>>         nr_fds = epoll_nr_fds(task_entries->nr_tasks);
>>         epollfd = prepare_epoll(nr_fds, &events);
>>         if (epollfd < 0)
>> diff --git a/criu/util.c b/criu/util.c
>> index 2cf0355..4ecfd4d 100644
>> --- a/criu/util.c
>> +++ b/criu/util.c
>> @@ -687,6 +687,21 @@ out:
>>         return ret;
>>   }
>>   +int close_status_fd(void)
>> +{
>> +       int c = 0;
>> +
>> +       if (opts.status_fd < 0)
>> +               return 0;
>> +
>> +       if (write(opts.status_fd, &c, 1) != 1) {
>> +               pr_perror("Unable to write into the status fd");
>> +               return -1;
>> +       }
>> +
>> +       return close_safe(&opts.status_fd);
>> +}
>> +
>>   int cr_daemon(int nochdir, int noclose, int *keep_fd, int close_fd)
>>   {
>>         int pid;
>> @@ -1144,6 +1159,9 @@ int run_tcp_server(bool daemon_mode, int *ask, int
>> cfd, int sk)
>>                 }
>>         }
>>   +     if (close_status_fd())
>> +               return -1;
>> +
>>         if (sk >= 0) {
>>                 ret = *ask = accept(sk, (struct sockaddr *)&caddr, &clen);
>>                 if (*ask < 0)
>
> otherwise
> Reviewed-by: Kir Kolyshkin <kir at openvz.org>
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu



-- 
Sincerely yours,
Mike.


More information about the CRIU mailing list