On Sun, 28 Dec 2008, Matthew Garrett wrote: > Ensure relatime updates atime at least once per day > > Allow atime to be updated once per day even with relatime. This lets > utilities like tmpreaper (which delete files based on last access time) > continue working. > > Signed-off-by: Matthew Garrett <mjg@xxxxxxxxxx> > Reviewed-by: Matthew Wilcox <willy@xxxxxxxxxxxxxxx> > Acked-by: Valerie Aurora Henson <vaurora@xxxxxxxxxx> > Acked-by: Alan Cox <alan@xxxxxxxxxx> > Acked-by: Ingo Molnar <mingo@xxxxxxx> > Overall I think the patch looks good. Feel free to add Reviewed-by: Jesper Juhl <jj@xxxxxxxxxxxxx> if you like. I only have a single pedantic comment below. > --- > > diff --git a/fs/inode.c b/fs/inode.c > index 0487ddb..057c92b 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -1179,6 +1179,40 @@ sector_t bmap(struct inode * inode, sector_t block) > } > EXPORT_SYMBOL(bmap); > > +/* > + * With relative atime, only update atime if the previous atime is > + * earlier than either the ctime or mtime or if at least a day has > + * passed since the last atime update. > + */ > +static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, > + struct timespec now) > +{ > + > + if (!(mnt->mnt_flags & MNT_RELATIME)) > + return 1; > + /* > + * Is mtime younger than atime? If yes, update atime: > + */ > + if (timespec_compare(&inode->i_mtime, &inode->i_atime) >= 0) > + return 1; > + /* > + * Is ctime younger than atime? If yes, update atime: > + */ > + if (timespec_compare(&inode->i_ctime, &inode->i_atime) >= 0) > + return 1; > + > + /* > + * Is the previous atime value older than a day? If yes, > + * update atime: > + */ > + if ((long)(now.tv_sec - inode->i_atime.tv_sec) >= 24*60*60) > + return 1; Not all days are 24*60*60 seconds long. Daylight savings time as well as leap seconds make this an inaccurate/incorrect constant for representing "one day". I don't think we really care, but perhaps the comment above should acknowledge the fact that this is aproximately one day? > + /* > + * Good, we can skip the atime update: > + */ > + return 0; > +} > + > /** > * touch_atime - update the access time > * @mnt: mount the inode is accessed on > @@ -1206,17 +1240,12 @@ void touch_atime(struct vfsmount *mnt, struct dentry *dentry) > goto out; > if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode)) > goto out; > - 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) > - goto out; > - } > > now = current_fs_time(inode->i_sb); > + > + if (!relatime_need_update(mnt, inode, now)) > + goto out; > + > if (timespec_equal(&inode->i_atime, &now)) > goto out; > -- Jesper Juhl <jj@xxxxxxxxxxxxx> Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html Plain text mails only, please http://www.expita.com/nomime.html -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html