Mercurial > dovecot > core-2.2
changeset 12515:820d370eb2fe
maildir: uidlist code cleanup.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 05 Dec 2010 21:07:01 +0000 |
parents | a803cd10b19c |
children | dc75c71b4671 |
files | src/lib-storage/index/maildir/maildir-uidlist.c |
diffstat | 1 files changed, 41 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-uidlist.c Sun Dec 05 21:05:40 2010 +0000 +++ b/src/lib-storage/index/maildir/maildir-uidlist.c Sun Dec 05 21:07:01 2010 +0000 @@ -52,8 +52,6 @@ #define UIDLIST_IS_LOCKED(uidlist) \ ((uidlist)->lock_count > 0) -#define UIDLIST_ALLOW_WRITING(uidlist) \ - (UIDLIST_IS_LOCKED(uidlist) || (uidlist)->mbox == NULL) struct maildir_uidlist_rec { uint32_t uid; @@ -64,8 +62,9 @@ ARRAY_DEFINE_TYPE(maildir_uidlist_rec_p, struct maildir_uidlist_rec *); struct maildir_uidlist { - struct maildir_mailbox *mbox; + struct mailbox *box; char *path; + struct maildir_index_header *mhdr; int fd; dev_t fd_dev; @@ -136,7 +135,7 @@ bool nonblock, bool refresh, bool refresh_when_locked) { - struct mailbox *box = &uidlist->mbox->box; + struct mailbox *box = uidlist->box; const char *control_dir, *path; mode_t old_mask; const enum dotlock_create_flags dotlock_flags = @@ -152,7 +151,7 @@ return 1; } - index_storage_lock_notify_reset(&uidlist->mbox->box); + index_storage_lock_notify_reset(uidlist->box); control_dir = mailbox_list_get_path(box->list, box->name, MAILBOX_LIST_PATH_TYPE_CONTROL); @@ -172,8 +171,7 @@ MAIL_ERROR_TEMP, MAIL_ERRSTR_LOCK_TIMEOUT); return 0; } - if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT || - uidlist->mbox == NULL) { + if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT) { if (errno == EACCES) { mail_storage_set_critical(box->storage, "%s", eacces_error_get_creating("file_dotlock_create", path)); @@ -186,7 +184,7 @@ } /* the control dir doesn't exist. create it unless the whole mailbox was just deleted. */ - if (!maildir_set_deleted(&uidlist->mbox->box)) + if (!maildir_set_deleted(uidlist->box)) return -1; } @@ -260,14 +258,16 @@ struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox) { + struct mailbox *box = &mbox->box; struct maildir_uidlist *uidlist; const char *control_dir; - control_dir = mailbox_list_get_path(mbox->box.list, mbox->box.name, + control_dir = mailbox_list_get_path(box->list, box->name, MAILBOX_LIST_PATH_TYPE_CONTROL); uidlist = i_new(struct maildir_uidlist, 1); - uidlist->mbox = mbox; + uidlist->box = box; + uidlist->mhdr = &mbox->maildir_hdr; uidlist->fd = -1; uidlist->path = i_strconcat(control_dir, "/"MAILDIR_UIDLIST_NAME, NULL); i_array_init(&uidlist->records, 128); @@ -279,23 +279,23 @@ uidlist->dotlock_settings.use_io_notify = TRUE; uidlist->dotlock_settings.use_excl_lock = - mbox->box.storage->set->dotlock_use_excl; + box->storage->set->dotlock_use_excl; uidlist->dotlock_settings.nfs_flush = - mbox->box.storage->set->mail_nfs_storage; + box->storage->set->mail_nfs_storage; uidlist->dotlock_settings.timeout = - mail_storage_get_lock_timeout(&mbox->storage->storage, + mail_storage_get_lock_timeout(box->storage, MAILDIR_UIDLIST_LOCK_STALE_TIMEOUT + 2); uidlist->dotlock_settings.stale_timeout = MAILDIR_UIDLIST_LOCK_STALE_TIMEOUT; uidlist->dotlock_settings.callback = dotlock_callback; - uidlist->dotlock_settings.context = &mbox->box; + uidlist->dotlock_settings.context = box; uidlist->dotlock_settings.temp_prefix = mbox->storage->temp_prefix; return uidlist; } static void maildir_uidlist_close(struct maildir_uidlist *uidlist) { - struct mail_storage *storage = uidlist->mbox->box.storage; + struct mail_storage *storage = uidlist->box->storage; if (uidlist->fd != -1) { if (close(uidlist->fd) < 0) { @@ -351,7 +351,7 @@ maildir_uidlist_set_corrupted(struct maildir_uidlist *uidlist, const char *fmt, ...) { - struct mail_storage *storage = uidlist->mbox->box.storage; + struct mail_storage *storage = uidlist->box->storage; va_list args; va_start(args, fmt); @@ -372,14 +372,8 @@ static void maildir_uidlist_update_hdr(struct maildir_uidlist *uidlist, const struct stat *st) { - struct maildir_index_header *mhdr; + struct maildir_index_header *mhdr = uidlist->mhdr; - if (uidlist->mbox == NULL) { - /* dbox is using this */ - return; - } - - mhdr = &uidlist->mbox->maildir_hdr; if (mhdr->uidlist_mtime == 0 && uidlist->version != UIDLIST_VERSION) { /* upgrading from older verson. don't update the uidlist times until it uses the new format */ @@ -699,7 +693,7 @@ maildir_uidlist_update_read(struct maildir_uidlist *uidlist, bool *retry_r, bool try_retry) { - struct mail_storage *storage = uidlist->mbox->box.storage; + struct mail_storage *storage = uidlist->box->storage; const char *line; uint32_t orig_next_uid, orig_uid_validity; struct istream *input; @@ -842,7 +836,7 @@ static int maildir_uidlist_stat(struct maildir_uidlist *uidlist, struct stat *st_r) { - struct mail_storage *storage = uidlist->mbox->box.storage; + struct mail_storage *storage = uidlist->box->storage; if (storage->set->mail_nfs_storage) { nfs_flush_file_handle_cache(uidlist->path); @@ -862,7 +856,7 @@ static int maildir_uidlist_has_changed(struct maildir_uidlist *uidlist, bool *recreated_r) { - struct mail_storage *storage = uidlist->mbox->box.storage; + struct mail_storage *storage = uidlist->box->storage; struct stat st; int ret; @@ -922,7 +916,7 @@ uidlist->fd = nfs_safe_open(uidlist->path, O_RDWR); if (uidlist->fd == -1 && errno != ENOENT) { - mail_storage_set_critical(uidlist->mbox->box.storage, + mail_storage_set_critical(uidlist->box->storage, "open(%s) failed: %m", uidlist->path); return -1; } @@ -961,8 +955,8 @@ int maildir_uidlist_refresh_fast_init(struct maildir_uidlist *uidlist) { - const struct maildir_index_header *mhdr = &uidlist->mbox->maildir_hdr; - struct mail_index *index = uidlist->mbox->box.index; + const struct maildir_index_header *mhdr = uidlist->mhdr; + struct mail_index *index = uidlist->box->index; struct mail_index_view *view; const struct mail_index_header *hdr; struct stat st; @@ -1188,22 +1182,22 @@ { const struct mail_index_header *hdr; - if (uidlist->mbox->box.opened) { - hdr = mail_index_get_header(uidlist->mbox->box.view); + if (uidlist->box->opened) { + hdr = mail_index_get_header(uidlist->box->view); if (hdr->uid_validity != 0) { uidlist->uid_validity = hdr->uid_validity; return; } } uidlist->uid_validity = - maildir_get_uidvalidity_next(uidlist->mbox->box.list); + maildir_get_uidvalidity_next(uidlist->box->list); } static int maildir_uidlist_write_fd(struct maildir_uidlist *uidlist, int fd, const char *path, unsigned int first_idx, uoff_t *file_size_r) { - struct mail_storage *storage = uidlist->mbox->box.storage; + struct mail_storage *storage = uidlist->box->storage; struct maildir_uidlist_iter_ctx *iter; struct ostream *output; struct maildir_uidlist_rec *rec; @@ -1307,11 +1301,11 @@ /* we could get here when opening and locking mailbox, before index files have been opened. */ - if (!uidlist->mbox->box.opened) + if (!uidlist->box->opened) return; - mail_index_refresh(uidlist->mbox->box.index); - view = mail_index_view_open(uidlist->mbox->box.index); + mail_index_refresh(uidlist->box->index); + view = mail_index_view_open(uidlist->box->index); count = array_count(&uidlist->records); hdr = mail_index_get_header(view); if (count * UIDLIST_COMPRESS_PERCENTAGE / 100 <= hdr->messages_count) { @@ -1356,7 +1350,7 @@ static int maildir_uidlist_recreate(struct maildir_uidlist *uidlist) { - struct mailbox *box = &uidlist->mbox->box; + struct mailbox *box = uidlist->box; const char *control_dir, *temp_path; struct stat st; mode_t old_mask; @@ -1379,15 +1373,14 @@ if (fd != -1) break; - if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT || - uidlist->mbox == NULL) { + if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT) { mail_storage_set_critical(box->storage, "open(%s, O_CREAT) failed: %m", temp_path); return -1; } /* the control dir doesn't exist. create it unless the whole mailbox was just deleted. */ - if (!maildir_set_deleted(&uidlist->mbox->box)) + if (!maildir_set_deleted(uidlist->box)) return -1; } @@ -1494,7 +1487,7 @@ static int maildir_uidlist_sync_update(struct maildir_uidlist_sync_ctx *ctx) { struct maildir_uidlist *uidlist = ctx->uidlist; - struct mail_storage *storage = uidlist->mbox->box.storage; + struct mail_storage *storage = uidlist->box->storage; struct stat st; uoff_t file_size; @@ -1606,7 +1599,7 @@ *sync_ctx_r = ctx = i_new(struct maildir_uidlist_sync_ctx, 1); ctx->uidlist = uidlist; ctx->sync_flags = sync_flags; - ctx->partial = (!locked && ctx->uidlist->mbox != NULL) || + ctx->partial = !locked || (sync_flags & MAILDIR_UIDLIST_SYNC_PARTIAL) != 0; ctx->locked = locked; ctx->first_unwritten_pos = (unsigned int)-1; @@ -1669,7 +1662,7 @@ } if (uid != 0) { if (rec->uid != uid && rec->uid != (uint32_t)-1) { - mail_storage_set_critical(uidlist->mbox->box.storage, + mail_storage_set_critical(uidlist->box->storage, "Maildir: %s changed UID %u -> %u", filename, rec->uid, uid); return -1; @@ -1736,7 +1729,7 @@ return -1; for (p = filename; *p != '\0'; p++) { if (*p == 13 || *p == 10) { - struct mailbox *box = &uidlist->mbox->box; + struct mailbox *box = uidlist->box; dir = mailbox_list_get_path(box->list, box->name, MAILBOX_LIST_PATH_TYPE_MAILBOX); @@ -1766,7 +1759,7 @@ MAILDIR_UIDLIST_REC_FLAG_MOVED); } else { old_rec = hash_table_lookup(uidlist->files, filename); - i_assert(old_rec != NULL || UIDLIST_ALLOW_WRITING(uidlist)); + i_assert(old_rec != NULL || UIDLIST_IS_LOCKED(uidlist)); rec = p_new(ctx->record_pool, struct maildir_uidlist_rec, 1); @@ -1888,7 +1881,7 @@ struct maildir_uidlist_rec **recs; unsigned int dest, count; - i_assert(UIDLIST_ALLOW_WRITING(ctx->uidlist)); + i_assert(UIDLIST_IS_LOCKED(ctx->uidlist)); i_assert(ctx->first_new_pos != (unsigned int)-1); if (ctx->first_unwritten_pos == (unsigned int)-1) @@ -1971,9 +1964,9 @@ /* mbox=NULL means we're coming from dbox rebuilding code. the dbox is already locked, so allow uidlist recreation */ - i_assert(ctx->locked || !ctx->changed || ctx->uidlist->mbox == NULL); + i_assert(ctx->locked || !ctx->changed); if ((ctx->changed || maildir_uidlist_want_compress(ctx)) && - !ctx->failed && (ctx->locked || ctx->uidlist->mbox == NULL)) { + !ctx->failed && ctx->locked) { T_BEGIN { if (maildir_uidlist_sync_update(ctx) < 0) { /* we couldn't write everything we wanted. make