Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3375:9e2abc4c341c HEAD
Whenever writing to cache file, also updated file_cache. Fixes problems with
mmap_disable=yes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 14 May 2005 14:29:36 +0300 |
parents | 8b2dd340e16d |
children | 7172331c2a7e |
files | src/lib-index/mail-cache-fields.c src/lib-index/mail-cache-private.h src/lib-index/mail-cache-transaction.c src/lib-index/mail-cache.c |
diffstat | 4 files changed, 33 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-fields.c Sat May 14 14:29:07 2005 +0300 +++ b/src/lib-index/mail-cache-fields.c Sat May 14 14:29:36 2005 +0300 @@ -296,15 +296,15 @@ copy_to_buf(cache, buffer, offsetof(struct mail_cache_field_private, last_used), sizeof(uint32_t)); - ret = pwrite_full(cache->fd, buffer->data, - sizeof(uint32_t) * cache->file_fields_count, - offset + MAIL_CACHE_FIELD_LAST_USED()); + ret = mail_cache_write(cache, buffer->data, + sizeof(uint32_t) * cache->file_fields_count, + offset + MAIL_CACHE_FIELD_LAST_USED()); if (ret == 0) { buffer_set_used_size(buffer, 0); copy_to_buf_byte(cache, buffer, offsetof(struct mail_cache_field, decision)); - ret = pwrite_full(cache->fd, buffer->data, + ret = mail_cache_write(cache, buffer->data, sizeof(uint8_t) * cache->file_fields_count, offset + MAIL_CACHE_FIELD_DECISION(cache->file_fields_count));
--- a/src/lib-index/mail-cache-private.h Sat May 14 14:29:07 2005 +0300 +++ b/src/lib-index/mail-cache-private.h Sat May 14 14:29:36 2005 +0300 @@ -177,6 +177,9 @@ int mail_cache_lock(struct mail_cache *cache); void mail_cache_unlock(struct mail_cache *cache); +int mail_cache_write(struct mail_cache *cache, const void *data, size_t size, + uoff_t offset); + int mail_cache_header_fields_read(struct mail_cache *cache); int mail_cache_header_fields_update(struct mail_cache *cache); void mail_cache_header_fields_get(struct mail_cache *cache, buffer_t *dest);
--- a/src/lib-index/mail-cache-transaction.c Sat May 14 14:29:07 2005 +0300 +++ b/src/lib-index/mail-cache-transaction.c Sat May 14 14:29:36 2005 +0300 @@ -167,11 +167,9 @@ if (prev_offset == 0) hdr->hole_offset = hole.next_offset; else { - if (pwrite_full(cache->fd, &hole.next_offset, - sizeof(hole.next_offset), prev_offset) < 0) { - mail_cache_set_syscall_error(cache, "pwrite_full()"); + if (mail_cache_write(cache, &hole.next_offset, + sizeof(hole.next_offset), prev_offset) < 0) return FALSE; - } } hdr->deleted_space -= hole.size; cache->hdr_modified = TRUE; @@ -284,10 +282,8 @@ hole.size = size; hole.magic = MAIL_CACHE_HOLE_HEADER_MAGIC; - if (pwrite_full(cache->fd, &hole, sizeof(hole), offset) < 0) { - mail_cache_set_syscall_error(cache, "pwrite_full()"); + if (mail_cache_write(cache, &hole, sizeof(hole), offset) < 0) return; - } cache->hdr_copy.deleted_space += size; cache->hdr_copy.hole_offset = offset; @@ -487,10 +483,8 @@ /* write it to file */ i_assert(ctx->cache_file_seq == cache->hdr->file_seq); - if (pwrite_full(cache->fd, rec, max_size, write_offset) < 0) { - mail_cache_set_syscall_error(cache, "pwrite_full()"); + if (mail_cache_write(cache, rec, max_size, write_offset) < 0) return -1; - } if (mail_cache_transaction_update_index(ctx, rec, seq, &seq_idx, seq_limit, @@ -639,10 +633,9 @@ if (mail_cache_transaction_get_space(ctx, size, size, &offset, &size, TRUE) <= 0) ret = -1; - else if (pwrite_full(cache->fd, data, size, offset) < 0) { - mail_cache_set_syscall_error(cache, "pwrite_full()"); + else if (mail_cache_write(cache, data, size, offset) < 0) ret = -1; - } else if (fdatasync(cache->fd) < 0) { + else if (fdatasync(cache->fd) < 0) { mail_cache_set_syscall_error(cache, "fdatasync()"); ret = -1; } else if (mail_cache_header_fields_get_next_offset(cache, @@ -651,11 +644,10 @@ else { /* after it's guaranteed to be in disk, update header offset */ offset = mail_index_uint32_to_offset(offset); - if (pwrite_full(cache->fd, &offset, sizeof(offset), - hdr_offset) < 0) { - mail_cache_set_syscall_error(cache, "pwrite_full()"); + if (mail_cache_write(cache, &offset, sizeof(offset), + hdr_offset) < 0) ret = -1; - } else { + else { /* we'll need to fix mappings. */ if (mail_cache_header_fields_read(cache) < 0) ret = -1; @@ -736,12 +728,8 @@ uint32_t old_offset, uint32_t new_offset) { new_offset += offsetof(struct mail_cache_record, prev_offset); - if (pwrite_full(cache->fd, &old_offset, - sizeof(old_offset), new_offset) < 0) { - mail_cache_set_syscall_error(cache, "pwrite_full()"); - return -1; - } - return 0; + return mail_cache_write(cache, &old_offset, sizeof(old_offset), + new_offset); } int mail_cache_link(struct mail_cache *cache, uint32_t old_offset,
--- a/src/lib-index/mail-cache.c Sat May 14 14:29:07 2005 +0300 +++ b/src/lib-index/mail-cache.c Sat May 14 14:29:36 2005 +0300 @@ -457,15 +457,27 @@ if (cache->hdr_modified) { cache->hdr_modified = FALSE; - if (pwrite_full(cache->fd, &cache->hdr_copy, - sizeof(cache->hdr_copy), 0) < 0) - mail_cache_set_syscall_error(cache, "pwrite_full()"); + (void)mail_cache_write(cache, &cache->hdr_copy, + sizeof(cache->hdr_copy), 0); mail_cache_update_need_compress(cache); } (void)mail_cache_lock_file(cache, F_UNLCK); } +int mail_cache_write(struct mail_cache *cache, const void *data, size_t size, + uoff_t offset) +{ + if (pwrite_full(cache->fd, data, size, offset) < 0) { + mail_cache_set_syscall_error(cache, "pwrite_full()"); + return -1; + } + + if (cache->file_cache != NULL) + file_cache_write(cache->file_cache, data, size, offset); + return 0; +} + struct mail_cache_view * mail_cache_view_open(struct mail_cache *cache, struct mail_index_view *iview) {