[Nix-dev] [PATCH] Handle "too many links" from btrfs.
David Brown
nix at davidb.org
Fri May 21 07:00:42 CEST 2010
The btrfs seems to report "too many links" when attempting to rename
the temp link. Handle this case in the same manner as generating too
many links.
---
src/libstore/optimise-store.cc | 14 +++++++++++++-
1 files changed, 13 insertions(+), 1 deletions(-)
diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc
index d150492..9a3b354 100644
--- a/src/libstore/optimise-store.cc
+++ b/src/libstore/optimise-store.cc
@@ -119,9 +119,21 @@ static void hashAndLink(bool dryRun, HashToPath & hashToPath,
}
/* Atomically replace the old file with the new hard link. */
- if (rename(tempLink.c_str(), path.c_str()) == -1)
+ if (rename(tempLink.c_str(), path.c_str()) == -1) {
+ if (errno == EMLINK) {
+ /* Some filesystems generate too many links on the
+ * rename, rather than on the original link. */
+ printMsg(lvlInfo, format("`%1%' has maximum number of links") % prevPath.first);
+ hashToPath[hash] = std::pair<Path, ino_t>(path, st.st_ino);
+
+ /* Unlink the temp link. */
+ if (unlink(tempLink.c_str()) == -1)
+ printMsg(lvlError, format("unable to unlink `%1%'") % tempLink);
+ return;
+ }
throw SysError(format("cannot rename `%1%' to `%2%'")
% tempLink % path);
+ }
} else
printMsg(lvlTalkative, format("would link `%1%' to `%2%'") % path % prevPath.first);
--
1.7.1
More information about the nix-dev
mailing list