[dovecot-cvs] dovecot/src/lib-index mail-cache-fields.c, 1.13,
1.14 mail-cache-private.h, 1.24, 1.25 mail-cache-transaction.c,
1.41, 1.42 mail-cache.c, 1.68, 1.69
cras at dovecot.org
cras at dovecot.org
Sat May 14 14:29:38 EEST 2005
Update of /var/lib/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv6734/lib-index
Modified Files:
mail-cache-fields.c mail-cache-private.h
mail-cache-transaction.c mail-cache.c
Log Message:
Whenever writing to cache file, also updated file_cache. Fixes problems with
mmap_disable=yes.
Index: mail-cache-fields.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-cache-fields.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- mail-cache-fields.c 8 Apr 2005 12:14:42 -0000 1.13
+++ mail-cache-fields.c 14 May 2005 11:29:36 -0000 1.14
@@ -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));
Index: mail-cache-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-cache-private.h,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -d -r1.24 -r1.25
--- mail-cache-private.h 12 Mar 2005 18:16:29 -0000 1.24
+++ mail-cache-private.h 14 May 2005 11:29:36 -0000 1.25
@@ -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);
Index: mail-cache-transaction.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-cache-transaction.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- mail-cache-transaction.c 8 Apr 2005 12:11:35 -0000 1.41
+++ mail-cache-transaction.c 14 May 2005 11:29:36 -0000 1.42
@@ -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,
Index: mail-cache.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-cache.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -d -r1.68 -r1.69
--- mail-cache.c 23 Apr 2005 08:45:24 -0000 1.68
+++ mail-cache.c 14 May 2005 11:29:36 -0000 1.69
@@ -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)
{
More information about the dovecot-cvs
mailing list