From: Timo Sirainen Date: Wed, 29 Nov 2017 13:39:45 +0000 (+0200) Subject: lib-storage: Add rebuild reason for mail_storage.list_index_corrupted() X-Git-Tag: 2.2.34~193 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0ccea627550485dead3be5012e886473f5d45eab;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add rebuild reason for mail_storage.list_index_corrupted() This is done in a bit kludgy way to keep API backwards compatible. v2.3 cleans this up. --- diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index 4fe2203d47..c1fbb31e69 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -587,9 +587,12 @@ int mailbox_list_index_handle_corruption(struct mailbox_list *list) { struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); struct mail_storage *const *storagep; + enum mail_storage_list_index_rebuild_reason reason; int ret = 0; - if (!ilist->call_corruption_callback) + if (ilist->call_corruption_callback) + reason = MAIL_STORAGE_LIST_INDEX_REBUILD_REASON_CORRUPTED; + else return 0; /* make sure we don't recurse */ @@ -599,6 +602,7 @@ int mailbox_list_index_handle_corruption(struct mailbox_list *list) array_foreach(&list->ns->all_storages, storagep) { if ((*storagep)->v.list_index_corrupted != NULL) { + (*storagep)->list_index_rebuild_reason = reason; if ((*storagep)->v.list_index_corrupted(*storagep) < 0) ret = -1; else { diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index f230041ecf..63742cdf38 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -20,6 +20,11 @@ #define MAIL_SHARED_STORAGE_NAME "shared" +enum mail_storage_list_index_rebuild_reason { + /* Mailbox list index was found to be corrupted. */ + MAIL_STORAGE_LIST_INDEX_REBUILD_REASON_CORRUPTED, +}; + struct mail_storage_module_register { unsigned int id; }; @@ -48,10 +53,12 @@ struct mail_storage_vfuncs { const char *vname, enum mailbox_flags flags); int (*purge)(struct mail_storage *storage); - /* Called when mailbox list index corruption has been detected. + /* Called when mailbox list index rebuild is requested. Additional + parameter is in storage.list_index_rebuild_reason. + The callback should add any missing mailboxes to the list index. Returns 0 on success, -1 on temporary failure that didn't properly - fix the index. */ + rebuild the index. */ int (*list_index_corrupted)(struct mail_storage *storage); }; @@ -152,6 +159,10 @@ struct mail_storage { struct mail_storage_callbacks callbacks; void *callback_context; + /* FIXME: remove in v2.3 - should be a parameter to + list_index_corrupted() */ + enum mail_storage_list_index_rebuild_reason list_index_rebuild_reason; + struct mail_binary_cache binary_cache; /* Filled lazily by mailbox_attribute_*() when accessing shared attributes. */