35bb946
From 1b7014dfc1584d1f3b10eb91c4f22e0deaca999d Mon Sep 17 00:00:00 2001
35bb946
From: Lauri Tirkkonen <lotheac@iki.fi>
35bb946
Date: Tue, 24 Oct 2017 20:40:50 +0300
35bb946
Subject: [PATCH] nspawn: EROFS for chowning mount points is not fatal (#7122)
35bb946
35bb946
This fixes --read-only with --private-users. mkdir_userns_p may return
35bb946
-EROFS if either mkdir or lchown fails; lchown failing is fine as the
35bb946
mount point will just be overmounted, and if mkdir fails then the
35bb946
following mount() will also fail (with ENOENT).
35bb946
35bb946
(cherry picked from commit 4f13e534282414b5e58ef31a26cc5c3f06f8cb18)
35bb946
---
35bb946
 src/nspawn/nspawn-mount.c | 8 ++++++--
35bb946
 1 file changed, 6 insertions(+), 2 deletions(-)
35bb946
35bb946
diff --git a/src/nspawn/nspawn-mount.c b/src/nspawn/nspawn-mount.c
35bb946
index 531f29cb7b..9b7ceb6bdc 100644
35bb946
--- a/src/nspawn/nspawn-mount.c
35bb946
+++ b/src/nspawn/nspawn-mount.c
35bb946
@@ -598,11 +598,15 @@ int mount_all(const char *dest,
35bb946
 
35bb946
                 r = mkdir_userns_p(dest, where, 0755, mount_settings, uid_shift);
35bb946
                 if (r < 0 && r != -EEXIST) {
35bb946
-                        if (fatal)
35bb946
+                        if (fatal && r != -EROFS)
35bb946
                                 return log_error_errno(r, "Failed to create directory %s: %m", where);
35bb946
 
35bb946
                         log_debug_errno(r, "Failed to create directory %s: %m", where);
35bb946
-                        continue;
35bb946
+                        /* If we failed mkdir() or chown() due to the root
35bb946
+                         * directory being read only, attempt to mount this fs
35bb946
+                         * anyway and let mount_verbose log any errors */
35bb946
+                        if (r != -EROFS)
35bb946
+                                continue;
35bb946
                 }
35bb946
 
35bb946
                 o = mount_table[k].options;