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