From: Timo Sirainen Date: Wed, 8 Feb 2017 10:03:30 +0000 (+0200) Subject: lib-index: Add MAIL_INDEX_OPEN_FLAG_NO_DIRTY X-Git-Tag: 2.3.0.rc1~2129 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=945565e0c9cf979b5feeba6fbd4efce3bf4484ad;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Add MAIL_INDEX_OPEN_FLAG_NO_DIRTY This way mailbox format backends that don't need dirty flags can use them for other purposes. --- diff --git a/src/lib-index/mail-index-sync-update.c b/src/lib-index/mail-index-sync-update.c index 0df38fb0b3..2edd4fee25 100644 --- a/src/lib-index/mail-index-sync-update.c +++ b/src/lib-index/mail-index-sync-update.c @@ -422,7 +422,8 @@ static int sync_append(const struct mail_index_record *rec, map->hdr.messages_count++; map->hdr.next_uid = rec->uid+1; - if ((new_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) + if ((new_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0 && + (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0) map->hdr.flags |= MAIL_INDEX_HDR_FLAG_HAVE_DIRTY; mail_index_header_update_lowwaters(ctx, rec->uid, new_flags); @@ -447,7 +448,8 @@ static int sync_flag_update(const struct mail_transaction_flag_update *u, seq1, seq2); } - if ((u->add_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) + if ((u->add_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0 && + (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0) view->map->hdr.flags |= MAIL_INDEX_HDR_FLAG_HAVE_DIRTY; flag_mask = ~u->remove_flags; @@ -856,7 +858,8 @@ static void mail_index_sync_update_hdr_dirty_flag(struct mail_index_map *map) const struct mail_index_record *rec; uint32_t seq; - if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0) + if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 || + (map->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) != 0) return; /* do we have dirty flags anymore? */ diff --git a/src/lib-index/mail-index-sync.c b/src/lib-index/mail-index-sync.c index 9ac2453923..692ae58666 100644 --- a/src/lib-index/mail-index-sync.c +++ b/src/lib-index/mail-index-sync.c @@ -175,7 +175,8 @@ mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx) int ret; if ((ctx->view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 && - (ctx->flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0) { + (ctx->flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 && + (ctx->view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0) { /* show dirty flags as flag updates */ mail_index_sync_add_dirty_updates(ctx); } @@ -253,7 +254,8 @@ mail_index_need_sync(struct mail_index *index, enum mail_index_sync_flags flags, return TRUE; if ((hdr->flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 && - (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0) + (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 && + (index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0) return TRUE; if (log_file_seq == (uint32_t)-1) { @@ -533,7 +535,8 @@ static bool mail_index_sync_view_have_any(struct mail_index_view *view, return TRUE; if ((view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 && - (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0) + (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 && + (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0) return TRUE; mail_transaction_log_get_head(view->index->log, &log_seq, &log_offset); diff --git a/src/lib-index/mail-index.h b/src/lib-index/mail-index.h index 41106abf8a..1dde6c5f3e 100644 --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@ -37,6 +37,9 @@ enum mail_index_open_flags { MAIL_INDEX_OPEN_FLAG_SAVEONLY = 0x400, /* Enable debug logging */ MAIL_INDEX_OPEN_FLAG_DEBUG = 0x800, + /* MAIL_INDEX_MAIL_FLAG_DIRTY can be used as a backend-specific flag. + All special handling of the flag is disabled by this. */ + MAIL_INDEX_OPEN_FLAG_NO_DIRTY = 0x1000, }; enum mail_index_header_compat_flags { @@ -55,7 +58,9 @@ enum mail_index_header_flag { enum mail_index_mail_flags { /* For private use by backend. Replacing flags doesn't change this. */ MAIL_INDEX_MAIL_FLAG_BACKEND = 0x40, - /* Message flags haven't been written to backend */ + /* Message flags haven't been written to backend. If + MAIL_INDEX_OPEN_FLAG_NO_DIRTY is set, this is treated as a + backend-specific flag with no special internal handling. */ MAIL_INDEX_MAIL_FLAG_DIRTY = 0x80, /* Force updating this message's modseq via a flag update record */ MAIL_INDEX_MAIL_FLAG_UPDATE_MODSEQ = 0x100