[lxc-devel] Bugfix for lxc-stop --nowait in 4.0 and master branches

Robert Vogelgesang vogel at folz.de
Tue Jun 23 08:47:44 UTC 2020


Hello @all,

in 4.0 and master branches, the lxc-stop command is currently a
no-op when using the --nowait flag.  Patch against current 4.0
branch attached, should apply to master, too.

Best regards,

Robert

-------------- next part --------------
diff -up lxc-stable-4.0/src/lxc/lxccontainer.c.nowait lxc-stable-4.0/src/lxc/lxccontainer.c
--- lxc-stable-4.0/src/lxc/lxccontainer.c.nowait	2020-06-15 18:52:01.000000000 +0200
+++ lxc-stable-4.0/src/lxc/lxccontainer.c	2020-06-16 15:52:20.782513170 +0200
@@ -2096,41 +2096,41 @@ static bool do_lxcapi_shutdown(struct lx
 
 		if (ret < MAX_STATE)
 			return false;
+	}
 
-		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);
-
-			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. :)
-			 */
-
-			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);
+	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);
+
+		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. :)
+		 */
+
+		if (timeout != 0) {
+			ret = poll(&pidfd_poll, 1, timeout * 1000);
+			if (ret < 0 || !(pidfd_poll.revents & POLLIN))
+				return false;
 
-			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)


More information about the lxc-devel mailing list