aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/optimise-store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/optimise-store.cc')
-rw-r--r--src/libstore/optimise-store.cc24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc
index 1bf8b7d83..2fd9a9bb8 100644
--- a/src/libstore/optimise-store.cc
+++ b/src/libstore/optimise-store.cc
@@ -148,10 +148,24 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
inodeHash.insert(st.st_ino);
return;
}
- if (errno != EEXIST)
- throw SysError(format("cannot link ‘%1%’ to ‘%2%’") % linkPath % path);
- /* Fall through if another process created ‘linkPath’ before
- we did. */
+
+ switch (errno) {
+ case EEXIST:
+ /* Fall through if another process created ‘linkPath’ before
+ we did. */
+ break;
+
+ case ENOSPC:
+ /* On ext4, that probably means the directory index is
+ full. When that happens, it's fine to ignore it: we
+ just effectively disable deduplication of this
+ file. */
+ printInfo("cannot link ‘%s’ to ‘%s’: %m", linkPath, path);
+ return;
+
+ default:
+ throw SysError("cannot link ‘%1%’ to ‘%2%’", linkPath, path);
+ }
}
/* Yes! We've seen a file with the same contents. Replace the
@@ -195,7 +209,7 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
printInfo(format("‘%1%’ has maximum number of links") % linkPath);
return;
}
- throw SysError(format("cannot link ‘%1%’ to ‘%2%’") % tempLink % linkPath);
+ throw SysError("cannot link ‘%1%’ to ‘%2%’", tempLink, linkPath);
}
/* Atomically replace the old file with the new hard link. */