Messages in this thread | | | Date | Tue, 5 Dec 2006 20:58:02 -0800 | From | Andrew Morton <> | Subject | Re: Relative atime (was Re: What's in ocfs2.git) |
| |
> On Mon, 4 Dec 2006 16:36:20 -0800 Valerie Henson <val_henson@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?
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |