Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6593:be0a8109cde6 HEAD
Check ctimes after all, but only as long as nfs_flush=FALSE.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 21 Oct 2007 16:44:32 +0300 |
parents | b6631550cf84 |
children | 2bd0aaeb35f3 |
files | src/lib/file-dotlock.c |
diffstat | 1 files changed, 17 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/file-dotlock.c Sun Oct 21 16:39:08 2007 +0300 +++ b/src/lib/file-dotlock.c Sun Oct 21 16:44:32 2007 +0300 @@ -49,7 +49,7 @@ dev_t dev; ino_t ino; off_t size; - time_t mtime; + time_t ctime, mtime; }; struct lock_info { @@ -117,24 +117,29 @@ static bool update_change_info(const struct stat *st, struct file_change_info *change, - time_t *last_change_r, time_t now) + time_t *last_change_r, time_t now, bool check_ctime) { - /* we don't check ctime because nfs_flush_attr_cache() changes it */ + /* ctime is checked only if we're not doing NFS attribute cache + flushes. it changes them. */ if (change->ino != st->st_ino || !CMP_DEV_T(change->dev, st->st_dev) || + (change->ctime != st->st_ctime && check_ctime) || change->mtime != st->st_mtime || change->size != st->st_size) { time_t change_time = now; - if (change->mtime == 0) { - /* First check, set last_change to file's mtime. - If mtime is higher than current time it's probably - used for metadata, so use ctime instead then. */ - change_time = st->st_mtime <= now ? + if (change->ctime == 0) { + /* First check, set last_change to file's change time. + Use mtime instead if it's higher, but only if it's + not higher than current time, because the mtime + can also be used for keeping metadata. */ + change_time = st->st_mtime <= now && + (st->st_mtime > st->st_ctime || !check_ctime) ? st->st_mtime : st->st_ctime; } if (*last_change_r < change_time) *last_change_r = change_time; change->ino = st->st_ino; change->dev = st->st_dev; + change->ctime = st->st_ctime; change->mtime = st->st_mtime; change->size = st->st_size; return TRUE; @@ -157,9 +162,9 @@ return 1; } - /* don't check ctime changes. nfs_flush_attr_cache() changes it. */ *changed_r = update_change_info(&st, &lock_info->lock_info, - &lock_info->last_change, now); + &lock_info->last_change, now, + !lock_info->set->nfs_flush); return 0; } @@ -245,7 +250,8 @@ } } else { (void)update_change_info(&st, &lock_info->file_info, - &lock_info->last_change, now); + &lock_info->last_change, now, + !lock_info->set->nfs_flush); } }