Please, see a couple of nits below 23.01.2018 10:41, Kirill Tkhai пишет: > Stanislav Kinsburskiy says: > > "SPFS manager has a special "--exit-with-spfs" options, which is used by CRIU. > The idea of the option is simple: force SPFS manager to exit, when it has > some > SPFS processes among its children (i.e. spfs was mounted at least once), > but all these processes have exited for whatever reason (which usually > happens > when restore has failed and spfs mounts where unmounted). > Although it works in overall (main SPFS manager process exits), its children > (responsible to SPFS replacement) may wait on FUTEX for "release" command > for corresponding SPFS mount and thus never stop until they are killed". > > 1 spfs-manager > 2 \_ spfs > 3 \_ spfs-manager > 4 \_ spfs > 5 \_ spfs-manager > > 2 and 3 are pair of a mount, and 4 and 5 are pair of another mount. > The patch makes spfs-manager 1 kill 3 in case of 2 exited. > > https://jira.sw.ru/browse/PSBM-80055 > > Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com> > --- > manager/context.c | 4 ++++ > manager/spfs.c | 1 + > 2 files changed, 5 insertions(+) > > diff --git a/manager/context.c b/manager/context.c > index 1eb37c9..4464a23 100644 > --- a/manager/context.c > +++ b/manager/context.c > @@ -53,6 +53,9 @@ static void cleanup_spfs_mount(struct > spfs_manager_context_s *ctx, > /* SPFS master was killed. We need to release the reference */ > spfs_release_mnt(info); > > + if (killed || WEXITSTATUS(status)) > + kill(info->replacer, SIGKILL); > +
There is "if (killed)" check above. Could you please move this hunk there? > info->dead = true; > del_spfs_info(ctx->spfs_mounts, info); > > @@ -88,6 +91,7 @@ static void sigchld_handler(int signal, siginfo_t *siginfo, > void *data) > * corresponding fd. > */ > spfs_release_mnt(info); > + info->replacer = -1; > } else { > info = find_spfs_by_pid(ctx->spfs_mounts, pid); > if (info) { > diff --git a/manager/spfs.c b/manager/spfs.c > index 3e0f667..0b94587 100644 > --- a/manager/spfs.c > +++ b/manager/spfs.c > @@ -39,6 +39,7 @@ int create_spfs_info(const char *id, > pr_err("failed to allocate\n"); > return -ENOMEM; > } > + info->replacer = -1; > Could you, please, move it down to the end of the function where unconditional actions take place? > err = init_mount_info(&info->mnt, id, mountpoint, ns_mountpoint); > if (err) > _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel