Mercurial > dovecot > core-2.2
changeset 12711:3582271a897e
dotlocks: When locking using hard links, make sure the dotlock's timestamp is new enough.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 25 Jan 2011 00:10:46 +0200 |
parents | 42ca32299617 |
children | fc02e620204d |
files | src/lib/file-dotlock.c |
diffstat | 1 files changed, 11 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/file-dotlock.c Mon Jan 24 00:31:05 2011 +0200 +++ b/src/lib/file-dotlock.c Tue Jan 25 00:10:46 2011 +0200 @@ -316,11 +316,12 @@ } static int try_create_lock_hardlink(struct lock_info *lock_info, bool write_pid, - string_t *tmp_path) + string_t *tmp_path, time_t now) { const char *temp_prefix = lock_info->set->temp_prefix; const char *p; mode_t old_mask; + struct stat st; if (lock_info->temp_path == NULL) { /* we'll need our temp file first. */ @@ -366,6 +367,14 @@ } lock_info->temp_path = str_c(tmp_path); + } else if (fstat(lock_info->fd, &st) < 0) { + i_error("fstat(%s) failed: %m", lock_info->temp_path); + return -1; + } else if (st.st_ctime < now) { + /* we've been waiting for a while. + refresh the file's timestamp. */ + if (utime(lock_info->temp_path, NULL) < 0) + i_error("utime(%s) failed: %m", lock_info->temp_path); } if (nfs_safe_link(lock_info->temp_path, @@ -520,7 +529,7 @@ ret = set->use_excl_lock ? try_create_lock_excl(&lock_info, write_pid) : try_create_lock_hardlink(&lock_info, write_pid, - tmp_path); + tmp_path, now); if (ret != 0) break; }