Zbigniew Jędrzejewski-Szmek 47313b
From 5b6b524662ddc3178b4d8c2e51eba5d023ad08c4 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek b397f2
From: Dave Reisner <dreisner@archlinux.org>
Zbigniew Jędrzejewski-Szmek b397f2
Date: Wed, 29 Oct 2014 13:32:43 -0400
Zbigniew Jędrzejewski-Szmek b397f2
Subject: [PATCH] nspawn: ignore EEXIST when creating mount point
Zbigniew Jędrzejewski-Szmek b397f2
Zbigniew Jędrzejewski-Szmek b397f2
A combination of commits f3c80515c and 79d80fc14 cause nspawn to
Zbigniew Jędrzejewski-Szmek b397f2
silently fail with a commandline such as:
Zbigniew Jędrzejewski-Szmek b397f2
Zbigniew Jędrzejewski-Szmek b397f2
  # systemd-nspawn -D /build/extra-x86_64 --bind=/usr
Zbigniew Jędrzejewski-Szmek b397f2
Zbigniew Jędrzejewski-Szmek b397f2
strace shows the culprit:
Zbigniew Jędrzejewski-Szmek b397f2
Zbigniew Jędrzejewski-Szmek b397f2
  [pid 27868] writev(2, [{"Failed to create mount point /build/extra-x86_64/usr: File exists", 82}, {"\n", 1}], 2) = 83
Zbigniew Jędrzejewski-Szmek b397f2
Zbigniew Jędrzejewski-Szmek b397f2
(cherry picked from commit 1ab19cb167b32967556eefd8f6d3df0e3de7d67d)
Zbigniew Jędrzejewski-Szmek b397f2
---
Zbigniew Jędrzejewski-Szmek b397f2
 src/nspawn/nspawn.c | 2 +-
Zbigniew Jędrzejewski-Szmek b397f2
 1 file changed, 1 insertion(+), 1 deletion(-)
Zbigniew Jędrzejewski-Szmek b397f2
Zbigniew Jędrzejewski-Szmek b397f2
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
Zbigniew Jędrzejewski-Szmek b397f2
index b6d9bc631c..d88987a580 100644
Zbigniew Jędrzejewski-Szmek b397f2
--- a/src/nspawn/nspawn.c
Zbigniew Jędrzejewski-Szmek b397f2
+++ b/src/nspawn/nspawn.c
Zbigniew Jędrzejewski-Szmek b397f2
@@ -758,7 +758,7 @@ static int mount_binds(const char *dest, char **l, bool ro) {
Zbigniew Jędrzejewski-Szmek b397f2
                  * and char devices. */
Zbigniew Jędrzejewski-Szmek b397f2
                 if (S_ISDIR(source_st.st_mode)) {
Zbigniew Jędrzejewski-Szmek b397f2
                         r = mkdir_label(where, 0755);
Zbigniew Jędrzejewski-Szmek b397f2
-                        if (r < 0) {
Zbigniew Jędrzejewski-Szmek b397f2
+                        if (r < 0 && errno != EEXIST) {
Zbigniew Jędrzejewski-Szmek b397f2
                                 log_error("Failed to create mount point %s: %s", where, strerror(-r));
Zbigniew Jędrzejewski-Szmek b397f2
 
Zbigniew Jędrzejewski-Szmek b397f2
                                 return r;