John, I believe I fixed the bug you reported in "possible timestamp related
problem".  Thanks for your help in reproducing the bug.

It was caused when reusing old inode times in a newly allocated inode, which
was active before, had some m/c/atimes in it, freed, and returned to the
inode cache: the older times were not reset, and if they were newer than the
current lower inode times, then they never reverted back.  This only
happened on systems with not much memory, that use a lot of inodes over a
long enough period of time -- enough to cause the icache to recycle them.

The fix was simple, as the patch below shows.  With this fix, I'm able to
built perl on your system several times for a few hours already; without the
fix, the build fails mid-way.

If I'm right, this should also fix two other reported bugs that
others have reported as file mtimes changing seemingly randomly:

        https://bugzilla.fsl.cs.sunysb.edu/show_bug.cgi?id=575
        https://bugzilla.fsl.cs.sunysb.edu/show_bug.cgi?id=578

Erez.


diff --git a/fs/unionfs/super.c b/fs/unionfs/super.c
index 37fdc29..562880a 100644
--- a/fs/unionfs/super.c
+++ b/fs/unionfs/super.c
@@ -55,6 +55,14 @@ static void unionfs_read_inode(struct inode *inode)
 
        inode->i_mapping->a_ops = &unionfs_aops;
 
+       /*
+        * reset times so unionfs_copy_attr_all can keep out time invariants
+        * right (upper inode time being the max of all lower ones).
+        */
+       inode->i_atime.tv_sec = inode->i_atime.tv_nsec = 0;
+       inode->i_mtime.tv_sec = inode->i_mtime.tv_nsec = 0;
+       inode->i_ctime.tv_sec = inode->i_ctime.tv_nsec = 0;
+
        unionfs_read_unlock(inode->i_sb);
 }
 
_______________________________________________
unionfs mailing list: http://unionfs.filesystems.org/
unionfs@mail.fsl.cs.sunysb.edu
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs

Reply via email to