]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
some more locking fixes
authorTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2004 19:16:23 +0000 (22:16 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2004 19:16:23 +0000 (22:16 +0300)
--HG--
branch : HEAD

src/lib-index/mail-index-lock.c
src/lib-index/mail-index-sync-update.c
src/lib-index/mail-transaction-log.c

index 51c47c05ec2f80975806566461ff350af3f5aa16..b3ef7e3d964adf276789666957ed099eb4c73702 100644 (file)
@@ -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)
index 9c0cfefe12620222baad91b4d9f3053bf30f0e97..6780ddde8b5e171307bab8271ea17ac86fa7f1d8 100644 (file)
@@ -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;
index f8ec536a839b71a0ebacf179c6d8f561b5307849..1a0710b920509b80e1636c7a8f6e32f0e780ca45 100644 (file)
@@ -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);