[Ocfs2-devel] Re: Relative atime (was Re: What's in ocfs2.git)
Andrew Morton
akpm at osdl.org
Tue Dec 5 20:58:02 PST 2006
> On Mon, 4 Dec 2006 16:36:20 -0800 Valerie Henson <val_henson at linux.intel.com> wrote:
> 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.
That seems like a good idea.
I found touch_atime() to be rather putrid, so I hacked it around a bit. The
end result:
void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
{
struct inode *inode = dentry->d_inode;
struct timespec now;
if (IS_RDONLY(inode))
return;
if (inode->i_flags & S_NOATIME)
return;
if (inode->i_sb->s_flags & MS_NOATIME)
return;
if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
return;
/*
* We may have a NULL vfsmount when coming from NFSD
*/
if (mnt) {
if (mnt->mnt_flags & MNT_NOATIME)
return;
if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
return;
if (mnt->mnt_flags & MNT_RELATIME) {
/*
* With relative atime, only update atime if the
* previous atime is earlier than either the ctime or
* mtime.
*/
if (timespec_compare(&inode->i_mtime,
&inode->i_atime) < 0 &&
timespec_compare(&inode->i_ctime,
&inode->i_atime) < 0)
return;
}
}
now = current_fs_time(inode->i_sb);
if (timespec_equal(&inode->i_atime, &now))
return;
inode->i_atime = now;
mark_inode_dirty_sync(inode);
}
Does it still look right?
Note the reordering to avoid the current_fs_time() call if poss.
That's the easy part. How are we going to get mount(8) patched?
More information about the Ocfs2-devel
mailing list