]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fixes for mmap_disable
authorTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2004 23:15:44 +0000 (02:15 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2004 23:15:44 +0000 (02:15 +0300)
--HG--
branch : HEAD

src/lib-index/mail-transaction-log-private.h
src/lib-index/mail-transaction-log-view.c
src/lib-index/mail-transaction-log.c
src/lib-index/mail-transaction-util.c

index 5cc8529dbf9d476ec5f421a1ab86000b563e4bd7..256789e18d8b6325a7f0c2fd5b9b8bbdcb5cc60f 100644 (file)
@@ -20,7 +20,6 @@ struct mail_transaction_log_file {
 
        buffer_t *buffer;
        uoff_t buffer_offset;
-       size_t buffer_size;
        void *mmap_base;
        size_t mmap_size;
 
index e933c13968c43913d9ef5710f73f658b1250609a..d443a2b146e6b777dc53c7c4959bae19e11a10f0 100644 (file)
@@ -176,7 +176,7 @@ static int log_view_get_next(struct mail_transaction_log_view *view,
        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 @@ static int log_view_get_next(struct mail_transaction_log_view *view,
                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 5ce6ac68a4d65c340ce0156c3c3e175f770776cd..65850512d49a2d048564a4bb02ecff11734718b2 100644 (file)
@@ -237,7 +237,8 @@ mail_transaction_log_file_read_hdr(struct mail_transaction_log_file *file,
        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 @@ mail_transaction_log_file_read(struct mail_transaction_log_file *file,
                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 @@ mail_transaction_log_file_read(struct mail_transaction_log_file *file,
                        return 1;
                }
        }
+       offset = file->buffer_offset + size;
 
        size = file->hdr.used_size - file->buffer_offset - size;
        if (size == 0)
@@ -606,7 +608,7 @@ mail_transaction_log_file_read(struct mail_transaction_log_file *file,
 
        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 @@ int mail_transaction_log_file_map(struct mail_transaction_log_file *file,
                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 @@ int mail_transaction_log_file_map(struct mail_transaction_log_file *file,
        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 @@ int mail_transaction_log_file_map(struct mail_transaction_log_file *file,
        }
        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 10fb78f7ff419033a7d1dd2435e734d3d2d11342..a1c3ec6e804ffb889d46fcc8cd0f7d950595714d 100644 (file)
@@ -152,8 +152,9 @@ mail_transaction_log_sort_expunges(buffer_t *expunges_buf,
                        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 @@ mail_transaction_log_sort_expunges(buffer_t *expunges_buf,
                        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 @@ mail_transaction_log_sort_expunges(buffer_t *expunges_buf,
                        dest_count++;
                } else {
                        /* use next record */
-                       dest[first].seq1 = new_exp.seq1;
-                       dest[first].seq2 = new_exp.seq2;
+                       dest[first] = new_exp;
                        first++;
                }