From: Timo Sirainen Date: Wed, 23 Nov 2011 17:10:34 +0000 (+0200) Subject: lib-index: Make sure we never go to infinite loop if fsck can't fix syncing problem. X-Git-Tag: 2.1.rc1~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=521dad64e5590b2addc7cb0594480e5cb2d543b4;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Make sure we never go to infinite loop if fsck can't fix syncing problem. --- diff --git a/src/lib-index/mail-index-sync.c b/src/lib-index/mail-index-sync.c index 5eadc917bd..77f1747315 100644 --- a/src/lib-index/mail-index-sync.c +++ b/src/lib-index/mail-index-sync.c @@ -421,12 +421,13 @@ mail_index_sync_begin_init(struct mail_index *index, return 1; } -int mail_index_sync_begin_to(struct mail_index *index, - struct mail_index_sync_ctx **ctx_r, - struct mail_index_view **view_r, - struct mail_index_transaction **trans_r, - uint32_t log_file_seq, uoff_t log_file_offset, - enum mail_index_sync_flags flags) +static int +mail_index_sync_begin_to2(struct mail_index *index, + struct mail_index_sync_ctx **ctx_r, + struct mail_index_view **view_r, + struct mail_index_transaction **trans_r, + uint32_t log_file_seq, uoff_t log_file_offset, + enum mail_index_sync_flags flags, bool *retry_r) { const struct mail_index_header *hdr; struct mail_index_sync_ctx *ctx; @@ -436,6 +437,8 @@ int mail_index_sync_begin_to(struct mail_index *index, i_assert(!index->syncing); + *retry_r = FALSE; + if (index->map != NULL && (index->map->hdr.flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) { /* index is corrupted and need to be reopened */ @@ -481,9 +484,8 @@ int mail_index_sync_begin_to(struct mail_index *index, to skip over it. fix the problem with fsck and try again. */ mail_index_fsck_locked(index); mail_index_sync_rollback(&ctx); - return mail_index_sync_begin_to(index, ctx_r, view_r, trans_r, - log_file_seq, log_file_offset, - flags); + *retry_r = TRUE; + return 0; } /* we need to have all the transactions sorted to optimize @@ -513,6 +515,27 @@ int mail_index_sync_begin_to(struct mail_index *index, return 1; } +int mail_index_sync_begin_to(struct mail_index *index, + struct mail_index_sync_ctx **ctx_r, + struct mail_index_view **view_r, + struct mail_index_transaction **trans_r, + uint32_t log_file_seq, uoff_t log_file_offset, + enum mail_index_sync_flags flags) +{ + bool retry; + int ret; + + ret = mail_index_sync_begin_to2(index, ctx_r, view_r, trans_r, + log_file_seq, log_file_offset, + flags, &retry); + if (retry) { + ret = mail_index_sync_begin_to2(index, ctx_r, view_r, trans_r, + log_file_seq, log_file_offset, + flags, &retry); + } + return ret; +} + bool mail_index_sync_has_expunges(struct mail_index_sync_ctx *ctx) { return array_is_created(&ctx->sync_trans->expunges) &&