This reverts commit 9e0e3d6025feb402e8c01ecc65c00075795c8f9b.

This commit was meant to mitigate the effect of unsynchronized or badly
synchronized clocks on different nodes on the mtime and ctime.  However, it has
turned out that the problem in this case (bz1304847) wasn't badly synchronized
clocks but mtime and ctime updates that were getting lost when re-reading
inodes from disk; see the next commit.

In addition, with commit 9e0e3d60, when an I_NEW in-memory inode is allocated,
the atime, mtime, and ctime in the I_NEW inode are not initialized, and so they
will end up with arbitrary values greater than the on-disk timestamps
(bz1374861, bz1375682).

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

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index cea85ce..f8f114f 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -283,7 +283,7 @@ static void gfs2_set_nlink(struct inode *inode, u32 nlink)
 static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
 {
        const struct gfs2_dinode *str = buf;
-       struct timespec footime;
+       struct timespec atime;
        u16 height, depth;
 
        if (unlikely(ip->i_no_addr != be64_to_cpu(str->di_num.no_addr)))
@@ -305,20 +305,14 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const 
void *buf)
        ip->i_disksize = be64_to_cpu(str->di_size);
        i_size_write(&ip->i_inode, ip->i_disksize);
        gfs2_set_inode_blocks(&ip->i_inode, be64_to_cpu(str->di_blocks));
-       footime.tv_sec = be64_to_cpu(str->di_atime);
-       footime.tv_nsec = be32_to_cpu(str->di_atime_nsec);
-       if (timespec_compare(&ip->i_inode.i_atime, &footime) < 0)
-               ip->i_inode.i_atime = footime;
-
-       footime.tv_sec = be64_to_cpu(str->di_mtime);
-       footime.tv_nsec = be32_to_cpu(str->di_mtime_nsec);
-       if (timespec_compare(&ip->i_inode.i_mtime, &footime) < 0)
-               ip->i_inode.i_mtime = footime;
-
-       footime.tv_sec = be64_to_cpu(str->di_ctime);
-       footime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
-       if (timespec_compare(&ip->i_inode.i_ctime, &footime) < 0)
-               ip->i_inode.i_ctime = footime;
+       atime.tv_sec = be64_to_cpu(str->di_atime);
+       atime.tv_nsec = be32_to_cpu(str->di_atime_nsec);
+       if (timespec_compare(&ip->i_inode.i_atime, &atime) < 0)
+               ip->i_inode.i_atime = atime;
+       ip->i_inode.i_mtime.tv_sec = be64_to_cpu(str->di_mtime);
+       ip->i_inode.i_mtime.tv_nsec = be32_to_cpu(str->di_mtime_nsec);
+       ip->i_inode.i_ctime.tv_sec = be64_to_cpu(str->di_ctime);
+       ip->i_inode.i_ctime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
 
        ip->i_goal = be64_to_cpu(str->di_goal_meta);
        ip->i_generation = be64_to_cpu(str->di_generation);
-- 
2.7.4

Reply via email to