[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