summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-22 22:08:15 (GMT)
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-22 22:08:15 (GMT)
commit2cb45e95438c113871fbbea5b4f629f9463034e7 (patch)
tree010a767b55ccb6b44c73024ab1fb8de536c5137c
parent09d74b3b5ac634495e17b92b2b785fa996ffce97 (diff)
downloadgit-2cb45e95438c113871fbbea5b4f629f9463034e7.zip
git-2cb45e95438c113871fbbea5b4f629f9463034e7.tar.gz
git-2cb45e95438c113871fbbea5b4f629f9463034e7.tar.bz2
Don't care about st_dev in the index file
Thomas Glanzmann points out that it doesn't work well with different clients accessing the repository over NFS - they have different views on what the "device" for the filesystem is. Of course, other filesystems may not even have stable inode numbers. But we don't care. At least for now.
-rw-r--r--Makefile4
-rw-r--r--read-cache.c18
2 files changed, 17 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index 3dec8b8..04f7d78 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,9 @@
# 1461501637330902918203684832716283019655932542976 hashes do not give you
# enough guarantees about no collisions between objects ever hapenning.
#
-# -DNSEC if you want git to care about sub-second file mtimes and ctimes.
+# -DUSE_NSEC if you want git to care about sub-second file mtimes and ctimes.
+# -DUSE_STDEV if you want git to care about st_dev changing
+#
# Note that you need some new glibc (at least >2.2.4) for this, and it will
# BREAK YOUR LOCAL DIFFS! show-diff and anything using it will likely randomly
# break unless your underlying filesystem supports those sub-second times
diff --git a/read-cache.c b/read-cache.c
index 24ebe38..34c040a 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -17,7 +17,7 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st)
{
ce->ce_ctime.sec = htonl(st->st_ctime);
ce->ce_mtime.sec = htonl(st->st_mtime);
-#ifdef NSEC
+#ifdef USE_NSEC
ce->ce_ctime.nsec = htonl(st->st_ctim.tv_nsec);
ce->ce_mtime.nsec = htonl(st->st_mtim.tv_nsec);
#endif
@@ -50,7 +50,7 @@ int ce_match_stat(struct cache_entry *ce, struct stat *st)
if (ce->ce_ctime.sec != htonl(st->st_ctime))
changed |= CTIME_CHANGED;
-#ifdef NSEC
+#ifdef USE_NSEC
/*
* nsec seems unreliable - not all filesystems support it, so
* as long as it is in the inode cache you get right nsec
@@ -65,9 +65,19 @@ int ce_match_stat(struct cache_entry *ce, struct stat *st)
if (ce->ce_uid != htonl(st->st_uid) ||
ce->ce_gid != htonl(st->st_gid))
changed |= OWNER_CHANGED;
- if (ce->ce_dev != htonl(st->st_dev) ||
- ce->ce_ino != htonl(st->st_ino))
+ if (ce->ce_ino != htonl(st->st_ino))
changed |= INODE_CHANGED;
+
+#ifdef USE_STDEV
+ /*
+ * st_dev breaks on network filesystems where different
+ * clients will have different views of what "device"
+ * the filesystem is on
+ */
+ if (ce->ce_dev != htonl(st->st_dev))
+ changed |= INODE_CHANGED;
+#endif
+
if (ce->ce_size != htonl(st->st_size))
changed |= DATA_CHANGED;
return changed;