From c5073d5b57145e9d2912ea69e44e25550bf274fe Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 24 Nov 2016 17:16:30 +0200 Subject: [PATCH] lib-index: Add mail_index_unset_fscked() This can be used to easily remove MAIL_INDEX_HDR_FLAG_FSCKD. It takes a transaction parameter instead of sync_ctx because some index rebuilds are done with a separate transaction while the sync_ctx is rolled back. --- src/lib-index/mail-index-transaction-update.c | 16 ++++++++++++++++ src/lib-index/mail-index.h | 3 +++ 2 files changed, 19 insertions(+) diff --git a/src/lib-index/mail-index-transaction-update.c b/src/lib-index/mail-index-transaction-update.c index 38678f446b..58f6e3e919 100644 --- a/src/lib-index/mail-index-transaction-update.c +++ b/src/lib-index/mail-index-transaction-update.c @@ -1307,6 +1307,22 @@ void mail_index_reset(struct mail_index_transaction *t) t->reset = TRUE; } +void mail_index_unset_fscked(struct mail_index_transaction *t) +{ + struct mail_index_header new_hdr = + *mail_index_get_header(t->view); + + i_assert(t->view->index->log_sync_locked); + + /* remove fsck'd-flag if it exists. */ + if ((new_hdr.flags & MAIL_INDEX_HDR_FLAG_FSCKD) != 0) { + new_hdr.flags &= ~MAIL_INDEX_HDR_FLAG_FSCKD; + mail_index_update_header(t, + offsetof(struct mail_index_header, flags), + &new_hdr.flags, sizeof(new_hdr.flags), FALSE); + } +} + void mail_index_set_deleted(struct mail_index_transaction *t) { i_assert(!t->index_undeleted); diff --git a/src/lib-index/mail-index.h b/src/lib-index/mail-index.h index 61a913d075..0f1dec565c 100644 --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@ -523,6 +523,9 @@ void mail_index_update_highest_modseq(struct mail_index_transaction *t, /* Reset the index before committing this transaction. This is usually done only when UIDVALIDITY changes. */ void mail_index_reset(struct mail_index_transaction *t); +/* Remove MAIL_INDEX_HDR_FLAG_FSCKD from header if it exists. This must be + called only during syncing so that the mailbox is locked. */ +void mail_index_unset_fscked(struct mail_index_transaction *t); /* Mark index deleted. No further changes will be possible after the transaction has been committed. */ void mail_index_set_deleted(struct mail_index_transaction *t);