summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Chase <[email protected]>2013-12-10 16:36:42 -0600
committerBrian Behlendorf <[email protected]>2013-12-12 10:23:58 -0800
commit84b0aac5fdab6daf8c4179dfba4abeb47e0d8b8e (patch)
treeccc6847d52119bddc85c6ebe7fd3156c0de4fd27
parent5cb65efe2c3d4aaa77a5881be364c443c859bbc8 (diff)
Fix atime handling.
Previously, the atime-modifying vnops called ZFS_ACCESSTIME_STAMP() followed by zfs_inode_update() to update the atime. However, since atimes are cached in the znode for delayed writing, the zfs_inode_update() function would effectively ignore the cached atime by reading it from the SA. This commit moves the updating of the atime in the inode into zfs_tstamp_update_setup() which is called by the ZFS_ACCESSTIME_STAMP() macro and eliminates the call to zfs_inode_update() in the atime-modifying vnops. It's possible the same thing could have been done directly in zfs_inode_update() but I wasn't sure that it was safe in all cases where it is called. The effect is that atime handling is as if "strictatime" were selected; even if the filesystem is mounted with "relatime". Signed-off-by: Brian Behlendorf <[email protected]> Issue #1949
-rw-r--r--module/zfs/zfs_vnops.c3
-rw-r--r--module/zfs/zfs_znode.c2
2 files changed, 2 insertions, 3 deletions
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c
index 6f25a6fff..4a34f055a 100644
--- a/module/zfs/zfs_vnops.c
+++ b/module/zfs/zfs_vnops.c
@@ -559,7 +559,6 @@ out:
zfs_range_unlock(rl);
ZFS_ACCESSTIME_STAMP(zsb, zp);
- zfs_inode_update(zp);
ZFS_EXIT(zsb);
return (error);
}
@@ -2148,7 +2147,6 @@ update:
error = 0;
ZFS_ACCESSTIME_STAMP(zsb, zp);
- zfs_inode_update(zp);
out:
ZFS_EXIT(zsb);
@@ -3681,7 +3679,6 @@ zfs_readlink(struct inode *ip, uio_t *uio, cred_t *cr)
mutex_exit(&zp->z_lock);
ZFS_ACCESSTIME_STAMP(zsb, zp);
- zfs_inode_update(zp);
ZFS_EXIT(zsb);
return (error);
}
diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c
index 9b44912cc..f737af449 100644
--- a/module/zfs/zfs_znode.c
+++ b/module/zfs/zfs_znode.c
@@ -1123,6 +1123,8 @@ zfs_tstamp_update_setup(znode_t *zp, uint_t flag, uint64_t mtime[2],
if (flag & ATTR_ATIME) {
ZFS_TIME_ENCODE(&now, zp->z_atime);
+ ZTOI(zp)->i_atime.tv_sec = zp->z_atime[0];
+ ZTOI(zp)->i_atime.tv_nsec = zp->z_atime[1];
}
if (flag & ATTR_MTIME) {