about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-11-15T11·59+0100
committerEelco Dolstra <edolstra@gmail.com>2018-11-15T12·20+0100
commita32ff2573ba4d0df4e3360c5a96398738da953f6 (patch)
tree831ef2cb312018a77abc42a9e701eae93914f526
parent32a0a223d589085ad43d77f4f36266a74e2822a8 (diff)
Fix 'Read-only file system' when building a derivation
-rw-r--r--src/libstore/build.cc2
-rw-r--r--src/libutil/util.cc3
-rw-r--r--src/libutil/util.hh1
3 files changed, 5 insertions, 1 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 676ad5856b13..9c408e29c06c 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -2193,6 +2193,7 @@ void DerivationGoal::startBuilder()
         userNamespaceSync.create();
 
         options.allowVfork = false;
+        options.restoreMountNamespace = false;
 
         Pid helper = startProcess([&]() {
 
@@ -2259,6 +2260,7 @@ void DerivationGoal::startBuilder()
 #endif
     {
         options.allowVfork = !buildUser && !drv->isBuiltin();
+        options.restoreMountNamespace = false;
         pid = startProcess([&]() {
             runChild();
         }, options);
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 6e4536e6e4ea..e12c4b258c25 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -936,7 +936,8 @@ pid_t startProcess(std::function<void()> fun, const ProcessOptions & options)
                 throw SysError("setting death signal");
 #endif
             restoreAffinity();
-            restoreMountNamespace();
+            if (options.restoreMountNamespace)
+                restoreMountNamespace();
             fun();
         } catch (std::exception & e) {
             try {
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 2689cbd8b412..d67bddc138c8 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -250,6 +250,7 @@ struct ProcessOptions
     bool dieWithParent = true;
     bool runExitHandlers = false;
     bool allowVfork = true;
+    bool restoreMountNamespace = true;
 };
 
 pid_t startProcess(std::function<void()> fun, const ProcessOptions & options = ProcessOptions());