dovecot: Check ctimes after all, but only as long as nfs_flush=F...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Oct 21 16:44:35 EEST 2007
details: http://hg.dovecot.org/dovecot/rev/be0a8109cde6
changeset: 6593:be0a8109cde6
user: Timo Sirainen <tss at iki.fi>
date: Sun Oct 21 16:44:32 2007 +0300
description:
Check ctimes after all, but only as long as nfs_flush=FALSE.
diffstat:
1 file changed, 18 insertions(+), 12 deletions(-)
src/lib/file-dotlock.c | 30 ++++++++++++++++++------------
diffs (72 lines):
diff -r b6631550cf84 -r be0a8109cde6 src/lib/file-dotlock.c
--- 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 @@ struct file_change_info {
dev_t dev;
ino_t ino;
off_t size;
- time_t mtime;
+ time_t ctime, mtime;
};
struct lock_info {
@@ -117,24 +117,29 @@ static pid_t read_local_pid(const char *
static bool
update_change_info(const struct stat *st, struct file_change_info *change,
- time_t *last_change_r, time_t now)
-{
- /* we don't check ctime because nfs_flush_attr_cache() changes it */
+ time_t *last_change_r, time_t now, bool check_ctime)
+{
+ /* 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 @@ static int update_lock_info(time_t now,
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 @@ static int check_lock(time_t now, struct
}
} 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);
}
}
More information about the dovecot-cvs
mailing list