mirror of
https://github.com/NixOS/nix
synced 2025-06-27 12:41:15 +02:00
remove linkOrCopy and use bindmounts for files in addDependency
This commit is contained in:
parent
5649229394
commit
630c2545d1
1 changed files with 21 additions and 41 deletions
|
@ -387,26 +387,6 @@ void LocalDerivationGoal::cleanupPostOutputsRegisteredModeNonCheck()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if __linux__
|
|
||||||
static void linkOrCopy(const Path & from, const Path & to)
|
|
||||||
{
|
|
||||||
if (link(from.c_str(), to.c_str()) == -1) {
|
|
||||||
/* Hard-linking fails if we exceed the maximum link count on a
|
|
||||||
file (e.g. 32000 of ext3), which is quite possible after a
|
|
||||||
'nix-store --optimise'. FIXME: actually, why don't we just
|
|
||||||
bind-mount in this case?
|
|
||||||
|
|
||||||
It can also fail with EPERM in BeegFS v7 and earlier versions
|
|
||||||
or fail with EXDEV in OpenAFS
|
|
||||||
which don't allow hard-links to other directories */
|
|
||||||
if (errno != EMLINK && errno != EPERM && errno != EXDEV)
|
|
||||||
throw SysError("linking '%s' to '%s'", to, from);
|
|
||||||
copyPath(from, to);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void LocalDerivationGoal::startBuilder()
|
void LocalDerivationGoal::startBuilder()
|
||||||
{
|
{
|
||||||
if ((buildUser && buildUser->getUIDCount() != 1)
|
if ((buildUser && buildUser->getUIDCount() != 1)
|
||||||
|
@ -1559,8 +1539,6 @@ void LocalDerivationGoal::addDependency(const StorePath & path)
|
||||||
|
|
||||||
auto st = lstat(source);
|
auto st = lstat(source);
|
||||||
|
|
||||||
if (S_ISDIR(st.st_mode)) {
|
|
||||||
|
|
||||||
/* Bind-mount the path into the sandbox. This requires
|
/* Bind-mount the path into the sandbox. This requires
|
||||||
entering its mount namespace, which is not possible
|
entering its mount namespace, which is not possible
|
||||||
in multithreaded programs. So we do this in a
|
in multithreaded programs. So we do this in a
|
||||||
|
@ -1573,7 +1551,12 @@ void LocalDerivationGoal::addDependency(const StorePath & path)
|
||||||
if (setns(sandboxMountNamespace.get(), 0) == -1)
|
if (setns(sandboxMountNamespace.get(), 0) == -1)
|
||||||
throw SysError("entering sandbox mount namespace");
|
throw SysError("entering sandbox mount namespace");
|
||||||
|
|
||||||
|
if (S_ISDIR(st.st_mode))
|
||||||
createDirs(target);
|
createDirs(target);
|
||||||
|
else {
|
||||||
|
createDirs(dirOf(target));
|
||||||
|
writeFile(target, "");
|
||||||
|
}
|
||||||
|
|
||||||
if (mount(source.c_str(), target.c_str(), "", MS_BIND, 0) == -1)
|
if (mount(source.c_str(), target.c_str(), "", MS_BIND, 0) == -1)
|
||||||
throw SysError("bind mount from '%s' to '%s' failed", source, target);
|
throw SysError("bind mount from '%s' to '%s' failed", source, target);
|
||||||
|
@ -1585,9 +1568,6 @@ void LocalDerivationGoal::addDependency(const StorePath & path)
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
throw Error("could not add path '%s' to sandbox", worker.store.printStorePath(path));
|
throw Error("could not add path '%s' to sandbox", worker.store.printStorePath(path));
|
||||||
|
|
||||||
} else
|
|
||||||
linkOrCopy(source, target);
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
throw Error("don't know how to make path '%s' (produced by a recursive Nix call) appear in the sandbox",
|
throw Error("don't know how to make path '%s' (produced by a recursive Nix call) appear in the sandbox",
|
||||||
worker.store.printStorePath(path));
|
worker.store.printStorePath(path));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue