]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir: uidlist code cleanup.
authorTimo Sirainen <tss@iki.fi>
Sun, 5 Dec 2010 21:07:01 +0000 (21:07 +0000)
committerTimo Sirainen <tss@iki.fi>
Sun, 5 Dec 2010 21:07:01 +0000 (21:07 +0000)
src/lib-storage/index/maildir/maildir-uidlist.c

index f113af64a1a3c4ec7b8ddd1688c6cb1519a78ddb..081dfd63167538277c5b8251f21265ec62936d7c 100644 (file)
@@ -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 @@ struct maildir_uidlist_rec {
 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 @@ static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
                                        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 @@ static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
                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 @@ static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
                                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 @@ static int maildir_uidlist_lock_timeout(struct maildir_uidlist *uidlist,
                }
                /* 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 @@ static bool dotlock_callback(unsigned int secs_left, bool stale, void *context)
 
 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 @@ struct maildir_uidlist *maildir_uidlist_init(struct maildir_mailbox *mbox)
 
        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 @@ static void ATTR_FORMAT(2, 3)
 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 @@ maildir_uidlist_set_corrupted(struct maildir_uidlist *uidlist,
 static void maildir_uidlist_update_hdr(struct maildir_uidlist *uidlist,
                                       const struct stat *st)
 {
-       struct maildir_index_header *mhdr;
-
-       if (uidlist->mbox == NULL) {
-               /* dbox is using this */
-               return;
-       }
+       struct maildir_index_header *mhdr = uidlist->mhdr;
 
-       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 @@ static int
 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 @@ maildir_uidlist_update_read(struct maildir_uidlist *uidlist,
 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 @@ maildir_uidlist_stat(struct maildir_uidlist *uidlist, struct stat *st_r)
 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 @@ static int maildir_uidlist_open_latest(struct maildir_uidlist *uidlist)
 
        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(struct maildir_uidlist *uidlist)
 
 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 @@ maildir_uidlist_generate_uid_validity(struct maildir_uidlist *uidlist)
 {
        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 @@ maildir_uidlist_records_drop_expunges(struct maildir_uidlist *uidlist)
 
        /* 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 @@ maildir_uidlist_records_drop_expunges(struct maildir_uidlist *uidlist)
 
 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 @@ static int maildir_uidlist_recreate(struct maildir_uidlist *uidlist)
                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 bool maildir_uidlist_want_recreate(struct maildir_uidlist_sync_ctx *ctx)
 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 @@ int maildir_uidlist_sync_init(struct maildir_uidlist *uidlist,
        *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 @@ maildir_uidlist_sync_next_partial(struct maildir_uidlist_sync_ctx *ctx,
        }
        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 @@ int maildir_uidlist_sync_next_uid(struct maildir_uidlist_sync_ctx *ctx,
                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 @@ int maildir_uidlist_sync_next_uid(struct maildir_uidlist_sync_ctx *ctx,
                                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 @@ static void maildir_uidlist_assign_uids(struct maildir_uidlist_sync_ctx *ctx)
        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 @@ void maildir_uidlist_sync_finish(struct maildir_uidlist_sync_ctx *ctx)
 
        /* 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