static int mdbox_sync_try_begin(struct mdbox_sync_context *ctx, enum mail_index_sync_flags sync_flags) { struct mdbox_mailbox *mbox = ctx->mbox; int ret; ret = mail_index_sync_begin(mbox->box.index, &ctx->index_sync_ctx, &ctx->sync_view, &ctx->trans, sync_flags); if (mail_index_reset_fscked(mbox->box.index)) mdbox_storage_set_corrupted(mbox->storage); if (ret < 0) { mailbox_set_index_error(&mbox->box); return -1; } if (ret == 0) { /* nothing to do */ return 0; } if (!mdbox_map_atomic_is_locked(ctx->atomic) && mail_index_sync_has_expunges(ctx->index_sync_ctx)) { /* we have expunges, so we need to write to map. it needs to be locked before mailbox index. */ mail_index_sync_rollback(&ctx->index_sync_ctx); if (mdbox_map_atomic_lock(ctx->atomic) < 0) return -1; return mdbox_sync_try_begin(ctx, sync_flags); } return 1; }
int cydir_sync_begin(struct cydir_mailbox *mbox, struct cydir_sync_context **ctx_r, bool force) { struct cydir_sync_context *ctx; enum mail_index_sync_flags sync_flags; int ret; ctx = i_new(struct cydir_sync_context, 1); ctx->mbox = mbox; sync_flags = index_storage_get_sync_flags(&mbox->box) | MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY; if (!force) sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES; ret = mail_index_sync_begin(mbox->box.index, &ctx->index_sync_ctx, &ctx->sync_view, &ctx->trans, sync_flags); if (ret <= 0) { if (ret < 0) mailbox_set_index_error(&mbox->box); i_free(ctx); *ctx_r = NULL; return ret; } cydir_sync_index(ctx); *ctx_r = ctx; return 0; }
static int raw_sync(struct raw_mailbox *mbox) { struct mail_index_sync_ctx *index_sync_ctx; struct mail_index_view *sync_view; struct mail_index_transaction *trans; uint32_t seq, uid_validity = ioloop_time; enum mail_index_sync_flags sync_flags; int ret; i_assert(!mbox->synced); sync_flags = index_storage_get_sync_flags(&mbox->box) | MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY | MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES; ret = mail_index_sync_begin(mbox->box.index, &index_sync_ctx, &sync_view, &trans, sync_flags); if (ret <= 0) { if (ret < 0) mailbox_set_index_error(&mbox->box); return ret; } /* set our uidvalidity */ mail_index_update_header(trans, offsetof(struct mail_index_header, uid_validity), &uid_validity, sizeof(uid_validity), TRUE); /* add our one and only message */ mail_index_append(trans, 1, &seq); index_mailbox_set_recent_uid(&mbox->box, 1); if (mail_index_sync_commit(&index_sync_ctx) < 0) { mailbox_set_index_error(&mbox->box); return -1; } mbox->synced = TRUE; return 0; }
int maildir_sync_index_begin(struct maildir_mailbox *mbox, struct maildir_sync_context *maildir_sync_ctx, struct maildir_index_sync_context **ctx_r) { struct mailbox *_box = &mbox->box; struct maildir_index_sync_context *ctx; struct mail_index_sync_ctx *sync_ctx; struct mail_index_view *view; struct mail_index_transaction *trans; enum mail_index_sync_flags sync_flags; sync_flags = index_storage_get_sync_flags(&mbox->box); /* don't drop recent messages if we're saving messages */ if (maildir_sync_ctx == NULL) sync_flags &= ~MAIL_INDEX_SYNC_FLAG_DROP_RECENT; if (mail_index_sync_begin(_box->index, &sync_ctx, &view, &trans, sync_flags) < 0) { mailbox_set_index_error(_box); return -1; } ctx = i_new(struct maildir_index_sync_context, 1); ctx->mbox = mbox; ctx->maildir_sync_ctx = maildir_sync_ctx; ctx->sync_ctx = sync_ctx; ctx->view = view; ctx->trans = trans; ctx->keywords_sync_ctx = maildir_keywords_sync_init(mbox->keywords, _box->index); ctx->sync_changes = index_sync_changes_init(ctx->sync_ctx, ctx->view, ctx->trans, maildir_is_backend_readonly(mbox)); ctx->start_time = time(NULL); *ctx_r = ctx; return 0; }