]> git.proxmox.com Git - mirror_lxc.git/commitdiff
lxccontainer: fix non-blocking container stop
authorRobert Vogelgesang <vogel@folz.de>
Tue, 23 Jun 2020 08:51:33 +0000 (10:51 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 23 Jun 2020 09:08:09 +0000 (11:08 +0200)
Stopping a lxc container with without waiting on it was broken in master. This
patch fixes it.

Signed-off-by: Robert Vogelgesang <vogel@folz.de>
src/lxc/lxccontainer.c

index 51422a56de88391f91941199b4d5873625402b36..aac6214825d2e507bb6c96b67ea9fc662dbade20 100644 (file)
@@ -2090,41 +2090,41 @@ static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout)
 
                if (ret < MAX_STATE)
                        return false;
+       }
 
-               if (pidfd >= 0) {
-                       struct pollfd pidfd_poll = {
-                           .events = POLLIN,
-                           .fd = pidfd,
-                       };
+       if (pidfd >= 0) {
+               struct pollfd pidfd_poll = {
+                   .events = POLLIN,
+                   .fd = pidfd,
+               };
 
-                       killret = lxc_raw_pidfd_send_signal(pidfd, haltsignal,
-                                                           NULL, 0);
-                       if (killret < 0)
-                               return log_warn(false, "Failed to send signal %d to pidfd %d",
-                                               haltsignal, pidfd);
+               killret = lxc_raw_pidfd_send_signal(pidfd, haltsignal,
+                                                   NULL, 0);
+               if (killret < 0)
+                       return log_warn(false, "Failed to send signal %d to pidfd %d",
+                                       haltsignal, pidfd);
 
-                       TRACE("Sent signal %d to pidfd %d", haltsignal, pidfd);
+               TRACE("Sent signal %d to pidfd %d", haltsignal, pidfd);
 
-                       /*
-                        * No need for going through all of the state server
-                        * complications anymore. We can just poll on pidfds. :)
-                        */
+               /*
+                * No need for going through all of the state server
+                * complications anymore. We can just poll on pidfds. :)
+                */
 
-                       if (timeout != 0) {
-                               ret = poll(&pidfd_poll, 1, timeout * 1000);
-                               if (ret < 0 || !(pidfd_poll.revents & POLLIN))
-                                       return false;
+               if (timeout != 0) {
+                       ret = poll(&pidfd_poll, 1, timeout * 1000);
+                       if (ret < 0 || !(pidfd_poll.revents & POLLIN))
+                               return false;
 
-                               TRACE("Pidfd polling detected container exit");
-                       }
-               } else {
-                       killret = kill(pid, haltsignal);
-                       if (killret < 0)
-                               return log_warn(false, "Failed to send signal %d to pid %d",
-                                               haltsignal, pid);
-
-                       TRACE("Sent signal %d to pid %d", haltsignal, pid);
+                       TRACE("Pidfd polling detected container exit");
                }
+       } else {
+               killret = kill(pid, haltsignal);
+               if (killret < 0)
+                       return log_warn(false, "Failed to send signal %d to pid %d",
+                                       haltsignal, pid);
+
+               TRACE("Sent signal %d to pid %d", haltsignal, pid);
        }
 
        if (timeout == 0)