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