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