From: Timo Sirainen Date: Wed, 28 Apr 2004 19:16:23 +0000 (+0300) Subject: some more locking fixes X-Git-Tag: 1.1.alpha1~4179 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d1727ed9c2ed8c520afa35cf0302fd94f7dfd723;p=thirdparty%2Fdovecot%2Fcore.git some more locking fixes --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-lock.c b/src/lib-index/mail-index-lock.c index 51c47c05ec..b3ef7e3d96 100644 --- a/src/lib-index/mail-index-lock.c +++ b/src/lib-index/mail-index-lock.c @@ -230,8 +230,10 @@ static int mail_index_copy(struct mail_index *index) if (fd == -1) return -1; - if (index->lock_type == F_UNLCK) - (void)mail_index_lock_mprotect(index, F_RDLCK); + if (index->lock_type == F_UNLCK) { + if (mail_index_lock_mprotect(index, F_RDLCK) < 0) + return -1; + } ret = write_full(fd, index->map->hdr, sizeof(*index->map->hdr)); if (ret < 0 || write_full(fd, index->map->records, @@ -288,6 +290,7 @@ static int mail_index_lock_exclusive_copy(struct mail_index *index) return -1; } + (void)mail_index_lock_mprotect(index, F_WRLCK); return 0; } @@ -307,8 +310,10 @@ int mail_index_lock_exclusive(struct mail_index *index, if (ret < 0) return -1; + if (mail_index_lock_exclusive_copy(index) < 0) + return -1; *lock_id_r = index->lock_id + 1; - return mail_index_lock_exclusive_copy(index); + return 0; } static int mail_index_copy_lock_finish(struct mail_index *index) diff --git a/src/lib-index/mail-index-sync-update.c b/src/lib-index/mail-index-sync-update.c index 9c0cfefe12..6780ddde8b 100644 --- a/src/lib-index/mail-index-sync-update.c +++ b/src/lib-index/mail-index-sync-update.c @@ -220,6 +220,7 @@ int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx) map = mail_index_map_to_memory(map); mail_index_unmap(index, index->map); index->map = map; + index->hdr = map->hdr; map->write_to_disk = TRUE; dest_idx = rec.seq1-1; diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index f8ec536a83..1a0710b920 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -332,7 +332,6 @@ static int mail_transaction_log_file_create(struct mail_transaction_log *log, index->log_locked = FALSE; return -1; } - index->log_locked = FALSE; ret = mail_index_map(index, FALSE); if (ret > 0) { @@ -347,6 +346,7 @@ static int mail_transaction_log_file_create(struct mail_transaction_log *log, } hdr.file_seq = index->hdr->log_file_seq; mail_index_unlock(index, lock_id); + index->log_locked = FALSE; if (ret <= 0) { (void)file_dotlock_delete(path, fd);