Mercurial > dovecot > original-hg > dovecot-1.2
changeset 508:d97b0454692e HEAD
Tree file wasn't correctly re-mmap()ed when sync_id changed.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 25 Oct 2002 05:25:52 +0300 |
parents | eebb12795ea7 |
children | 48910084a8ce |
files | src/lib-index/mail-tree.c |
diffstat | 1 files changed, 21 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-tree.c Fri Oct 25 04:59:36 2002 +0300 +++ b/src/lib-index/mail-tree.c Fri Oct 25 05:25:52 2002 +0300 @@ -44,20 +44,8 @@ return FALSE; } -int _mail_tree_mmap_update(MailTree *tree, int forced) +static int mmap_update(MailTree *tree) { - if (!forced && tree->header != NULL && - tree->sync_id == tree->header->sync_id) { - /* make sure file size hasn't changed */ - tree->mmap_used_length = tree->header->used_file_size; - if (tree->mmap_used_length > tree->mmap_full_length) { - i_panic("Tree file size was grown without " - "updating sync_id"); - } - - return TRUE; - } - i_assert(!tree->anon_mmap); if (tree->mmap_base != NULL) { @@ -134,6 +122,23 @@ return TRUE; } +int _mail_tree_mmap_update(MailTree *tree, int forced) +{ + if (!forced && tree->header != NULL && + tree->sync_id == tree->header->sync_id) { + /* make sure file size hasn't changed */ + tree->mmap_used_length = tree->header->used_file_size; + if (tree->mmap_used_length > tree->mmap_full_length) { + i_panic("Tree file size was grown without " + "updating sync_id"); + } + + return TRUE; + } + + return mmap_update(tree) && mmap_verify(tree); +} + static MailTree *mail_tree_open(MailIndex *index) { MailTree *tree; @@ -209,7 +214,7 @@ return FALSE; do { - if (!_mail_tree_mmap_update(tree, TRUE)) + if (!mmap_update(tree)) break; if (tree->mmap_full_length == 0) { @@ -281,8 +286,7 @@ return FALSE; if (!mail_tree_init(tree) || - !_mail_tree_mmap_update(tree, TRUE) || - !mmap_verify(tree)) { + !_mail_tree_mmap_update(tree, TRUE)) { tree->index->header->flags |= MAIL_INDEX_FLAG_REBUILD_TREE; return FALSE; } @@ -360,7 +364,7 @@ tree->header->sync_id++; tree->modified = TRUE; - if (!_mail_tree_mmap_update(tree, TRUE) || !mmap_verify(tree)) + if (!_mail_tree_mmap_update(tree, TRUE)) return FALSE; return TRUE;