[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