The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3556

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 35f0c46e0da931d32c297d203831ea5da9bef72c Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Mon, 19 Oct 2020 11:46:08 +0200
Subject: [PATCH 1/3] sync: switch to new error helpers

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/sync.c | 55 ++++++++++++++++++--------------------------------
 1 file changed, 20 insertions(+), 35 deletions(-)

diff --git a/src/lxc/sync.c b/src/lxc/sync.c
index c98357cb64..52c065f539 100644
--- a/src/lxc/sync.c
+++ b/src/lxc/sync.c
@@ -23,30 +23,21 @@ static int __sync_wait(int fd, int sequence)
        ssize_t ret;
 
        ret = lxc_read_nointr(fd, &sync, sizeof(sync));
-       if (ret < 0) {
-               SYSERROR("Sync wait failure");
-               return -1;
-       }
+       if (ret < 0)
+               return log_error_errno(-1, errno, "Sync wait failure");
 
        if (!ret)
                return 0;
 
-       if ((size_t)ret != sizeof(sync)) {
-               ERROR("Unexpected sync size: %zu expected %zu", (size_t)ret, 
sizeof(sync));
-               return -1;
-       }
+       if ((size_t)ret != sizeof(sync))
+               return log_error(-1, "Unexpected sync size: %zu expected %zu", 
(size_t)ret, sizeof(sync));
 
-       if (sync == LXC_SYNC_ERROR) {
-               ERROR("An error occurred in another process "
-                     "(expected sequence number %d)", sequence);
-               return -1;
-       }
+       if (sync == LXC_SYNC_ERROR)
+               return log_error(-1, "An error occurred in another process 
(expected sequence number %d)", sequence);
+
+       if (sync != sequence)
+               return log_error(-1, "Invalid sequence number %d. Expected 
sequence number %d", sync, sequence);
 
-       if (sync != sequence) {
-               ERROR("Invalid sequence number %d. Expected sequence number %d",
-                     sync, sequence);
-               return -1;
-       }
        return 0;
 }
 
@@ -54,10 +45,9 @@ static int __sync_wake(int fd, int sequence)
 {
        int sync = sequence;
 
-       if (lxc_write_nointr(fd, &sync, sizeof(sync)) < 0) {
-               SYSERROR("Sync wake failure");
-               return -1;
-       }
+       if (lxc_write_nointr(fd, &sync, sizeof(sync)) < 0)
+               return log_error_errno(-1, errno, "Sync wake failure");
+
        return 0;
 }
 
@@ -65,6 +55,7 @@ static int __sync_barrier(int fd, int sequence)
 {
        if (__sync_wake(fd, sequence))
                return -1;
+
        return __sync_wait(fd, sequence+1);
 }
 
@@ -103,31 +94,25 @@ int lxc_sync_init(struct lxc_handler *handler)
        int ret;
 
        ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, handler->sync_sock);
-       if (ret) {
-               SYSERROR("failed to create synchronization socketpair");
-               return -1;
-       }
+       if (ret)
+               return log_error_errno(-1, errno, "failed to create 
synchronization socketpair");
 
        /* Be sure we don't inherit this after the exec */
-       fcntl(handler->sync_sock[0], F_SETFD, FD_CLOEXEC);
+       ret = fcntl(handler->sync_sock[0], F_SETFD, FD_CLOEXEC);
+       if (ret < 0)
+               return log_error_errno(-1, errno, "Failed to make socket 
close-on-exec");
 
        return 0;
 }
 
 void lxc_sync_fini_child(struct lxc_handler *handler)
 {
-       if (handler->sync_sock[0] != -1) {
-               close(handler->sync_sock[0]);
-               handler->sync_sock[0] = -1;
-       }
+       close_prot_errno_disarm(handler->sync_sock[0]);
 }
 
 void lxc_sync_fini_parent(struct lxc_handler *handler)
 {
-       if (handler->sync_sock[1] != -1) {
-               close(handler->sync_sock[1]);
-               handler->sync_sock[1] = -1;
-       }
+       close_prot_errno_disarm(handler->sync_sock[1]);
 }
 
 void lxc_sync_fini(struct lxc_handler *handler)

From 5befd767a6cb65e3c08456c73501b7fec63b564c Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Mon, 19 Oct 2020 11:56:53 +0200
Subject: [PATCH 2/3] sync: log synchronization states

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/sync.c | 11 ++++++++++-
 src/lxc/sync.h | 28 ++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/src/lxc/sync.c b/src/lxc/sync.c
index 52c065f539..7ccdb71fc5 100644
--- a/src/lxc/sync.c
+++ b/src/lxc/sync.c
@@ -56,36 +56,44 @@ static int __sync_barrier(int fd, int sequence)
        if (__sync_wake(fd, sequence))
                return -1;
 
-       return __sync_wait(fd, sequence+1);
+       return __sync_wait(fd, sequence + 1);
 }
 
 int lxc_sync_barrier_parent(struct lxc_handler *handler, int sequence)
 {
+       TRACE("Child waking parent with sequence %s and waiting for sequence 
%s",
+             sync_to_string(sequence), sync_to_string(sequence + 1));
        return __sync_barrier(handler->sync_sock[0], sequence);
 }
 
 int lxc_sync_barrier_child(struct lxc_handler *handler, int sequence)
 {
+       TRACE("Parent waking child with sequence %s and waiting with sequence 
%s",
+             sync_to_string(sequence), sync_to_string(sequence + 1));
        return __sync_barrier(handler->sync_sock[1], sequence);
 }
 
 int lxc_sync_wake_parent(struct lxc_handler *handler, int sequence)
 {
+       TRACE("Child waking parent with sequence %s", sync_to_string(sequence));
        return __sync_wake(handler->sync_sock[0], sequence);
 }
 
 int lxc_sync_wait_parent(struct lxc_handler *handler, int sequence)
 {
+       TRACE("Parent waiting for child with sequence %s", 
sync_to_string(sequence));
        return __sync_wait(handler->sync_sock[0], sequence);
 }
 
 int lxc_sync_wait_child(struct lxc_handler *handler, int sequence)
 {
+       TRACE("Child waiting for parent with sequence %s", 
sync_to_string(sequence));
        return __sync_wait(handler->sync_sock[1], sequence);
 }
 
 int lxc_sync_wake_child(struct lxc_handler *handler, int sequence)
 {
+       TRACE("Child waking parent with sequence %s", sync_to_string(sequence));
        return __sync_wake(handler->sync_sock[1], sequence);
 }
 
@@ -102,6 +110,7 @@ int lxc_sync_init(struct lxc_handler *handler)
        if (ret < 0)
                return log_error_errno(-1, errno, "Failed to make socket 
close-on-exec");
 
+       TRACE("Initialized synchronization infrastructure");
        return 0;
 }
 
diff --git a/src/lxc/sync.h b/src/lxc/sync.h
index c09ac8fb05..944853f631 100644
--- a/src/lxc/sync.h
+++ b/src/lxc/sync.h
@@ -20,6 +20,34 @@ enum {
        LXC_SYNC_ERROR          = -1 /* Used to report errors from another 
process */
 };
 
+static inline const char *sync_to_string(int state)
+{
+       switch (state) {
+       case LXC_SYNC_STARTUP:
+               return "startup";
+       case LXC_SYNC_CONFIGURE:
+               return "configure";
+       case LXC_SYNC_POST_CONFIGURE:
+               return "post-configure";
+       case LXC_SYNC_CGROUP:
+               return "cgroup";
+       case LXC_SYNC_CGROUP_UNSHARE:
+               return "cgroup-unshare";
+       case LXC_SYNC_CGROUP_LIMITS:
+               return "cgroup-limits";
+       case LXC_SYNC_READY_START:
+               return "ready-start";
+       case LXC_SYNC_RESTART:
+               return "restart";
+       case LXC_SYNC_POST_RESTART:
+               return "post-restart";
+       case LXC_SYNC_ERROR:
+               return "error";
+       default:
+               return "invalid sync state";
+       }
+}
+
 __hidden extern int lxc_sync_init(struct lxc_handler *handler);
 __hidden extern void lxc_sync_fini(struct lxc_handler *);
 __hidden extern void lxc_sync_fini_parent(struct lxc_handler *);

From fbfe5c8208fd8304ee74b2e297585c64a0d6bd81 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Mon, 19 Oct 2020 11:38:17 +0200
Subject: [PATCH 3/3] start: improve devpts fd sending

Closes: #3549.
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 src/lxc/conf.c  | 4 +++-
 src/lxc/start.c | 7 ++++---
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index 5962009e34..b8058ffdce 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -1531,13 +1531,15 @@ static int lxc_setup_devpts(struct lxc_handler *handler)
 
        devpts_fd = openat(-EBADF, "/dev/pts", O_CLOEXEC | O_DIRECTORY | O_PATH 
| O_NOFOLLOW);
        if (devpts_fd < 0) {
+               devpts_fd = -EBADF;
                TRACE("Failed to create detached devpts mount");
-               ret = lxc_abstract_unix_send_fds(sock, NULL, 0, NULL, 0);
+               ret = lxc_abstract_unix_send_fds(sock, NULL, 0, &devpts_fd, 
sizeof(int));
        } else {
                ret = lxc_abstract_unix_send_fds(sock, &devpts_fd, 1, NULL, 0);
        }
        if (ret < 0)
                return log_error_errno(-1, errno, "Failed to send devpts fd to 
parent");
+       TRACE("Sent devpts file descriptor %d to parent", devpts_fd);
 
        /* Remove any pre-existing /dev/ptmx file. */
        ret = remove("/dev/ptmx");
diff --git a/src/lxc/start.c b/src/lxc/start.c
index 322debf00f..7b29d40834 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -1953,13 +1953,14 @@ static int lxc_spawn(struct lxc_handler *handler)
                }
        }
 
-       ret = lxc_abstract_unix_recv_fds(data_sock1, &handler->conf->devpts_fd, 
1, NULL, 0);
+       ret = lxc_abstract_unix_recv_fds(data_sock1, &handler->conf->devpts_fd, 
1,
+                                        &handler->conf->devpts_fd,
+                                        sizeof(handler->conf->devpts_fd));
        if (ret < 0) {
                SYSERROR("Failed to receive devpts fd from child");
                goto out_delete_net;
        }
-       if (ret == 0)
-               handler->conf->devpts_fd = -EBADF;
+       TRACE("Received devpts file descriptor %d from child", 
handler->conf->devpts_fd);
 
        /* Now all networks are created, network devices are moved into place,
         * and the correct names and ifindices in the respective namespaces have
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to