When inodes are read from disk, GFS2 will only update in-memory atimes
older than the on-disk atimes; this prevents atimes from going
backwards.  The atimes of newly allocated inodes are initialized to 0.
This means that when an atime is explicitly set to a negative value,
this value will not persist.

Fix by setting the atime of newly allocated inodes to the lowest
possible value instead of 0.

Fixes xfstest generic/258.

Signed-off-by: Andreas Gruenbacher <agrue...@redhat.com>
---
 fs/gfs2/inode.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 52783d7bae1a..4749a6b8e4dd 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -189,7 +189,8 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, 
unsigned int type,
 
                gfs2_set_iop(inode);
 
-               inode->i_atime.tv_sec = 0;
+               /* Lowest possible timestamp; will be overwritten in 
gfs2_dinode_in. */
+               inode->i_atime.tv_sec = 1LL << (8 * 
sizeof(inode->i_atime.tv_sec) - 1);
                inode->i_atime.tv_nsec = 0;
 
                unlock_new_inode(inode);
-- 
2.13.3

Reply via email to