[dovecot-cvs] dovecot/src/lib-index mail-transaction-log-private.h, 1.2, 1.3 mail-transaction-log-view.c, 1.3, 1.4 mail-transaction-log.c, 1.7, 1.8 mail-transaction-util.c, 1.2, 1.3

cras at procontrol.fi cras at procontrol.fi
Thu Apr 29 02:15:47 EEST 2004


Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv14276/lib-index

Modified Files:
	mail-transaction-log-private.h mail-transaction-log-view.c 
	mail-transaction-log.c mail-transaction-util.c 
Log Message:
fixes for mmap_disable



Index: mail-transaction-log-private.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log-private.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-transaction-log-private.h	28 Apr 2004 02:00:39 -0000	1.2
+++ mail-transaction-log-private.h	28 Apr 2004 23:15:44 -0000	1.3
@@ -20,7 +20,6 @@
 
 	buffer_t *buffer;
 	uoff_t buffer_offset;
-	size_t buffer_size;
 	void *mmap_base;
 	size_t mmap_size;
 

Index: mail-transaction-log-view.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log-view.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mail-transaction-log-view.c	28 Apr 2004 02:39:03 -0000	1.3
+++ mail-transaction-log-view.c	28 Apr 2004 23:15:44 -0000	1.4
@@ -176,7 +176,7 @@
 	const struct mail_transaction_type_map *type_rec;
 	const void *data;
 	unsigned int record_size;
-	size_t size;
+	size_t file_size;
 
 	view->prev_file_seq = file->hdr.file_seq;
 	view->prev_file_offset = view->file_offset;
@@ -187,24 +187,27 @@
 		return 0;
 	}
 
-	data = buffer_get_data(file->buffer, &size);
-	if (view->file_offset + sizeof(*hdr) > file->hdr.used_size) {
+	data = buffer_get_data(file->buffer, &file_size);
+	file_size += file->buffer_offset;
+
+	if (view->file_offset + sizeof(*hdr) > file_size) {
 		mail_transaction_log_file_set_corrupted(file,
-			"offset points outside file (%u + %"PRIuSIZE_T" > %u)",
-			view->file_offset, sizeof(*hdr), size);
+			"offset points outside file "
+			"(%"PRIuUOFF_T" + %"PRIuSIZE_T" > %"PRIuSIZE_T")",
+			view->file_offset, sizeof(*hdr), file_size);
 		return -1;
 	}
 
 	hdr = CONST_PTR_OFFSET(data, view->file_offset - file->buffer_offset);
 	view->file_offset += sizeof(*hdr);
 
-	if (file->hdr.used_size - view->file_offset < hdr->size) {
+	if (file_size - view->file_offset < hdr->size) {
 		mail_transaction_log_file_set_corrupted(file,
-			"record size too large "
-			"(type=0x%x, offset=%u, size=%u, end=%u)",
+			"record size too large (type=0x%x, offset=%"PRIuUOFF_T
+			", size=%u, end=%"PRIuSIZE_T")",
 			hdr->type & MAIL_TRANSACTION_TYPE_MASK,
-			view->file_offset, hdr->size, file->hdr.used_size);
-                view->file_offset = file->hdr.used_size;
+			view->file_offset, hdr->size, file_size);
+                view->file_offset = file_size;
 		return -1;
 	}
 

Index: mail-transaction-log.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- mail-transaction-log.c	28 Apr 2004 21:41:56 -0000	1.7
+++ mail-transaction-log.c	28 Apr 2004 23:15:44 -0000	1.8
@@ -237,7 +237,8 @@
 	if (ret < 0) {
 		// FIXME: handle ESTALE
 		mail_index_file_set_syscall_error(file->log->index,
-						  file->filepath, "pread()");
+						  file->filepath,
+						  "pread_full()");
 		return -1;
 	}
 	if (ret == 0) {
@@ -577,7 +578,7 @@
 		file->buffer_offset = offset;
 
 		data = buffer_get_space_unsafe(file->buffer, 0, size);
-		ret = pread(file->fd, data, size, offset);
+		ret = pread_full(file->fd, data, size, offset);
 		if (ret < 0 && errno == ESTALE) {
 			/* log file was deleted in NFS server, fail silently */
 			ret = 0;
@@ -599,6 +600,7 @@
 			return 1;
 		}
 	}
+	offset = file->buffer_offset + size;
 
 	size = file->hdr.used_size - file->buffer_offset - size;
 	if (size == 0)
@@ -606,7 +608,7 @@
 
 	data = buffer_append_space_unsafe(file->buffer, size);
 
-	ret = pread(file->fd, data, size, offset);
+	ret = pread_full(file->fd, data, size, offset);
 	if (ret < 0 && errno == ESTALE) {
 		/* log file was deleted in NFS server, fail silently */
 		ret = 0;
@@ -647,7 +649,8 @@
 		return -1;
 	}
 
-	if (st.st_size == file->hdr.used_size && end_offset == (uoff_t)-1) {
+	if (st.st_size == file->hdr.used_size &&
+	    file->buffer_offset <= start_offset && end_offset == (uoff_t)-1) {
 		/* we've seen the whole file.. do we have all of it mapped? */
 		size = buffer_get_used_size(file->buffer);
 		if (file->buffer_offset + size == file->hdr.used_size)
@@ -689,15 +692,20 @@
 	if (!use_mmap) {
 		ret = mail_transaction_log_file_read(file, start_offset);
 		if (ret <= 0) {
+			if (ret < 0) {
+				mail_index_file_set_syscall_error(index,
+					file->filepath, "pread_full()");
+ 			} else {
+				mail_transaction_log_file_set_corrupted(file,
+					"Unexpected EOF");
+			}
+
 			/* make sure we don't leave ourself in
 			   inconsistent state */
 			if (file->buffer != NULL) {
 				buffer_free(file->buffer);
 				file->buffer = NULL;
 			}
-			file->buffer_size = 0;
-		} else {
-			file->buffer_size = buffer_get_used_size(file->buffer);
 		}
 		return ret;
 	}
@@ -713,7 +721,7 @@
 	}
 	file->buffer = buffer_create_const_data(default_pool, file->mmap_base,
 						file->mmap_size);
-	file->buffer_size = buffer_get_used_size(file->buffer);
+	file->buffer_offset = 0;
 	return 1;
 }
 

Index: mail-transaction-util.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-util.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-transaction-util.c	28 Apr 2004 02:39:03 -0000	1.2
+++ mail-transaction-util.c	28 Apr 2004 23:15:44 -0000	1.3
@@ -152,8 +152,9 @@
 			prev_seq = dest[i].seq2+1;
 		}
 
-		new_exp.seq1 = src->seq1 + expunges_before;
-		new_exp.seq2 = src->seq2 + expunges_before;
+		new_exp = *src;
+		new_exp.seq1 += expunges_before;
+		new_exp.seq2 += expunges_before;
 
 		/* if src[] is in format {1,2}{1,2} rather than {1,2}{3,4}:
 		   expunges_before += new_exp.seq2 - new_exp.seq1 + 1;*/
@@ -164,12 +165,14 @@
 			count = dest[i].seq2 - dest[i].seq1 + 1;
 			expunges_before += count;
 			new_exp.seq2 += count;
+			new_exp.seq2 = dest[i].uid2;
 			i++;
 		}
 
 		if (first > 0 && new_exp.seq1 == dest[first-1].seq2+1) {
 			/* continue previous record */
 			dest[first-1].seq2 = new_exp.seq2;
+			dest[first-1].uid2 = new_exp.uid2;
 		} else if (i == first) {
 			buffer_insert(expunges_buf, i * sizeof(new_exp),
 				      &new_exp, sizeof(new_exp));
@@ -179,8 +182,7 @@
 			dest_count++;
 		} else {
 			/* use next record */
-			dest[first].seq1 = new_exp.seq1;
-			dest[first].seq2 = new_exp.seq2;
+			dest[first] = new_exp;
 			first++;
 		}
 



More information about the dovecot-cvs mailing list