aboutsummaryrefslogtreecommitdiffstats
path: root/fs/inode.c
diff options
context:
space:
mode:
authorValerie Henson <val_henson@linux.intel.com>2006-12-13 03:34:34 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-13 12:05:50 -0500
commit47ae32d6a54955a041cdc30b06d0bb16e75f68d5 (patch)
treeb28623f98ae536342d35443c6548c373df342e7f /fs/inode.c
parentb227613841d4d211a10c5860acc73e133b613bc0 (diff)
[PATCH] relative atime
Add "relatime" (relative atime) support. Relative atime only updates the atime if the previous atime is older than the mtime or ctime. Like noatime, but useful for applications like mutt that need to know when a file has been read since it was last modified. A corresponding patch against mount(8) is available at http://userweb.kernel.org/~akpm/mount-relative-atime.txt Signed-off-by: Valerie Henson <val_henson@linux.intel.com> Cc: Mark Fasheh <mark.fasheh@oracle.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Christoph Hellwig <hch@lst.de> Cc: Karel Zak <kzak@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/inode.c')
-rw-r--r--fs/inode.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/fs/inode.c b/fs/inode.c
index 04536ebc5ac4..bf21dc6d0dbd 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1177,13 +1177,27 @@ void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
1177 return; 1177 return;
1178 if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode)) 1178 if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
1179 return; 1179 return;
1180
1181 if (mnt->mnt_flags & MNT_RELATIME) {
1182 /*
1183 * With relative atime, only update atime if the
1184 * previous atime is earlier than either the ctime or
1185 * mtime.
1186 */
1187 if (timespec_compare(&inode->i_mtime,
1188 &inode->i_atime) < 0 &&
1189 timespec_compare(&inode->i_ctime,
1190 &inode->i_atime) < 0)
1191 return;
1192 }
1180 } 1193 }
1181 1194
1182 now = current_fs_time(inode->i_sb); 1195 now = current_fs_time(inode->i_sb);
1183 if (!timespec_equal(&inode->i_atime, &now)) { 1196 if (timespec_equal(&inode->i_atime, &now))
1184 inode->i_atime = now; 1197 return;
1185 mark_inode_dirty_sync(inode); 1198
1186 } 1199 inode->i_atime = now;
1200 mark_inode_dirty_sync(inode);
1187} 1201}
1188EXPORT_SYMBOL(touch_atime); 1202EXPORT_SYMBOL(touch_atime);
1189 1203