dovecot-1.1: dbox metadata writing fixes

dovecot at dovecot.org dovecot at dovecot.org
Tue Mar 11 09:10:15 EET 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/81994d76fd24
changeset: 7407:81994d76fd24
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Mar 11 09:08:50 2008 +0200
description:
dbox metadata writing fixes

diffstat:

1 file changed, 8 insertions(+), 11 deletions(-)
src/lib-storage/index/dbox/dbox-file.c |   19 ++++++++-----------

diffs (60 lines):

diff -r 8afcffeae291 -r 81994d76fd24 src/lib-storage/index/dbox/dbox-file.c
--- a/src/lib-storage/index/dbox/dbox-file.c	Tue Mar 11 09:07:08 2008 +0200
+++ b/src/lib-storage/index/dbox/dbox-file.c	Tue Mar 11 09:08:50 2008 +0200
@@ -1039,7 +1039,6 @@ static int dbox_file_metadata_write_real
 	char space[DBOX_EXTRA_SPACE];
 	string_t *str;
 	uoff_t offset;
-	size_t last_change_len, orig_len;
 	int ret;
 
 	if (!array_is_created(&file->metadata_changes)) {
@@ -1066,7 +1065,6 @@ static int dbox_file_metadata_write_real
 	}
 
 	str = t_str_new(512);
-	last_change_len = orig_len = 0;
 	/* overwrite existing metadata fields */
 	for (; i < count; i++) {
 		for (j = 0; j < changes_count; j++) {
@@ -1076,14 +1074,10 @@ static int dbox_file_metadata_write_real
 		if (j != changes_count) {
 			str_append(str, changes[j]);
 			str_append_c(str, '\n');
-			last_change_len = str_len(str);
 		} else {
 			str_append(str, metadata[i]);
 			str_append_c(str, '\n');
-			if (orig_len != str_len(str))
-				last_change_len = str_len(str);
-		}
-		orig_len += strlen(metadata[i]) + 1;
+		}
 	}
 	/* add new metadata */
 	for (j = 0; j < changes_count; j++) {
@@ -1094,10 +1088,8 @@ static int dbox_file_metadata_write_real
 		if (i == count) {
 			str_append(str, changes[j]);
 			str_append_c(str, '\n');
-			last_change_len = str_len(str);
-		}
-	}
-	str_truncate(str, last_change_len);
+		}
+	}
 	if (skip_pos + str_len(str) >= file->metadata_len) {
 		if ((ret = dbox_file_grow_metadata(file, skip_pos +
 						   str_len(str))) <= 0)
@@ -1111,6 +1103,11 @@ static int dbox_file_metadata_write_real
 		str_append_n(str, space, I_MIN(sizeof(space), space_needed));
 	}
 	i_assert(skip_pos + str_len(str) <= file->metadata_len);
+
+	if (file->metadata_space_pos < skip_pos + str_len(str)) {
+		/* metadata was grown, update space position */
+		file->metadata_space_pos = skip_pos + str_len(str);
+	}
 
 	ret = pwrite_full(file->fd, str_data(str), str_len(str),
 			  offset + skip_pos);


More information about the dovecot-cvs mailing list