From: Timo Sirainen Date: Thu, 24 Nov 2016 16:12:18 +0000 (+0200) Subject: mdbox: Rebuild index after it's been fsck'd X-Git-Tag: 2.3.0.rc1~2511 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=96088ba9ef3b6c113a0a41f3778cd38f437ddc3d;p=thirdparty%2Fdovecot%2Fcore.git mdbox: Rebuild index after it's been fsck'd --- diff --git a/src/lib-storage/index/dbox-multi/mdbox-map.c b/src/lib-storage/index/dbox-multi/mdbox-map.c index cf993efbbd..6c602c3290 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-map.c +++ b/src/lib-storage/index/dbox-multi/mdbox-map.c @@ -238,6 +238,19 @@ int mdbox_map_refresh(struct mdbox_map *map) return ret; } +bool mdbox_map_is_fscked(struct mdbox_map *map) +{ + const struct mail_index_header *hdr; + + if (map->view == NULL) { + /* map isn't opened yet. don't bother. */ + return FALSE; + } + + hdr = mail_index_get_header(map->view); + return (hdr->flags & MAIL_INDEX_HDR_FLAG_FSCKD) != 0; +} + static void mdbox_map_get_ext_hdr(struct mdbox_map *map, struct mail_index_view *view, struct mdbox_map_mail_index_header *hdr_r) @@ -533,6 +546,11 @@ void mdbox_map_atomic_set_success(struct mdbox_map_atomic_context *atomic) atomic->success = TRUE; } +void mdbox_map_atomic_unset_fscked(struct mdbox_map_atomic_context *atomic) +{ + mail_index_unset_fscked(atomic->sync_trans); +} + int mdbox_map_atomic_finish(struct mdbox_map_atomic_context **_atomic) { struct mdbox_map_atomic_context *atomic = *_atomic; diff --git a/src/lib-storage/index/dbox-multi/mdbox-map.h b/src/lib-storage/index/dbox-multi/mdbox-map.h index b89ae812ae..9571f0e9ec 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-map.h +++ b/src/lib-storage/index/dbox-multi/mdbox-map.h @@ -41,6 +41,8 @@ int mdbox_map_open(struct mdbox_map *map); int mdbox_map_open_or_create(struct mdbox_map *map); /* Refresh the map. Returns 0 if ok, -1 if error. */ int mdbox_map_refresh(struct mdbox_map *map); +/* Returns TRUE if map has been fsck'd. */ +bool mdbox_map_is_fscked(struct mdbox_map *map); /* Return the current rebuild counter */ uint32_t mdbox_map_get_rebuild_count(struct mdbox_map *map); @@ -81,6 +83,8 @@ void mdbox_map_atomic_set_failed(struct mdbox_map_atomic_context *atomic); transaction or append is committed within this atomic, but not when the atomic is used standalone. */ void mdbox_map_atomic_set_success(struct mdbox_map_atomic_context *atomic); +/* Remove fsck'd flag. */ +void mdbox_map_atomic_unset_fscked(struct mdbox_map_atomic_context *atomic); /* Commit/rollback changes within this atomic context. */ int mdbox_map_atomic_finish(struct mdbox_map_atomic_context **atomic); diff --git a/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c b/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c index 4eece4f933..9b3e122425 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c +++ b/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c @@ -581,6 +581,7 @@ rebuild_mailbox(struct mdbox_storage_rebuild_context *ctx, mdbox_header_update(ctx, rebuild_ctx, mbox); rebuild_mailbox_multi(ctx, rebuild_ctx, mbox, view, trans); index_index_rebuild_deinit(&rebuild_ctx, dbox_get_uidvalidity_next); + mail_index_unset_fscked(trans); mail_index_sync_set_reason(sync_ctx, "mdbox storage rebuild"); if (mail_index_sync_commit(&sync_ctx) < 0) { @@ -982,6 +983,7 @@ int mdbox_storage_rebuild(struct mdbox_storage *storage) atomic = mdbox_map_atomic_begin(storage->map); ret = mdbox_storage_rebuild_in_context(storage, atomic); mdbox_map_atomic_set_success(atomic); + mdbox_map_atomic_unset_fscked(atomic); if (mdbox_map_atomic_finish(&atomic) < 0) ret = -1; return ret; diff --git a/src/lib-storage/index/dbox-multi/mdbox-sync.c b/src/lib-storage/index/dbox-multi/mdbox-sync.c index fd59e8592c..29b1e72a4a 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-sync.c +++ b/src/lib-storage/index/dbox-multi/mdbox-sync.c @@ -226,6 +226,8 @@ int mdbox_sync_begin(struct mdbox_mailbox *mbox, enum mdbox_sync_flags flags, struct mdbox_sync_context **ctx_r) { struct mail_storage *storage = mbox->box.storage; + const struct mail_index_header *hdr = + mail_index_get_header(mbox->box.view); struct mdbox_sync_context *ctx; const char *reason; enum mail_index_sync_flags sync_flags; @@ -237,6 +239,8 @@ int mdbox_sync_begin(struct mdbox_mailbox *mbox, enum mdbox_sync_flags flags, /* avoid race conditions with mailbox creation, don't check for dbox headers until syncing has locked the mailbox */ rebuild = mbox->storage->corrupted || + (hdr->flags & MAIL_INDEX_HDR_FLAG_FSCKD) != 0 || + mdbox_map_is_fscked(mbox->storage->map) || (flags & MDBOX_SYNC_FLAG_FORCE_REBUILD) != 0; if (rebuild && (flags & MDBOX_SYNC_FLAG_NO_REBUILD) == 0) { if (mdbox_storage_rebuild_in_context(mbox->storage, atomic) < 0)