Mercurial > dovecot > original-hg > dovecot-1.2
changeset 1546:9c9ce9c71509 HEAD
Close index files before deleting the mailbox.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 14 Jun 2003 20:38:06 +0300 |
parents | 9ce3f3f950c5 |
children | 54764a1cde30 |
files | src/lib-storage/index/index-storage.c src/lib-storage/index/index-storage.h src/lib-storage/index/maildir/maildir-storage.c src/lib-storage/index/mbox/mbox-storage.c |
diffstat | 4 files changed, 41 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.c Sat Jun 14 20:22:02 2003 +0300 +++ b/src/lib-storage/index/index-storage.c Sat Jun 14 20:38:06 2003 +0300 @@ -99,6 +99,23 @@ i_unreached(); } +void index_storage_destroy_unrefed(void) +{ + struct index_list **list, *rec; + + for (list = &indexes; *list != NULL;) { + rec = *list; + + if (rec->refcount == 0) { + rec->index->free(rec->index); + *list = rec->next; + i_free(rec); + } else { + list = &(*list)->next; + } + } +} + static enum mail_data_field get_data_fields(const char *fields) { static const char *field_names[] = {
--- a/src/lib-storage/index/index-storage.h Sat Jun 14 20:22:02 2003 +0300 +++ b/src/lib-storage/index/index-storage.h Sat Jun 14 20:38:06 2003 +0300 @@ -44,6 +44,7 @@ void index_storage_add(struct mail_index *index); struct mail_index *index_storage_lookup_ref(const char *path); void index_storage_unref(struct mail_index *index); +void index_storage_destroy_unrefed(void); struct index_mailbox * index_storage_init(struct mail_storage *storage, struct mailbox *box,
--- a/src/lib-storage/index/maildir/maildir-storage.c Sat Jun 14 20:22:02 2003 +0300 +++ b/src/lib-storage/index/maildir/maildir-storage.c Sat Jun 14 20:38:06 2003 +0300 @@ -431,10 +431,14 @@ if (storage->index_dir != NULL && *name != '/' && *name != '~' && strcmp(storage->index_dir, storage->dir) != 0) { index_dir = t_strconcat(storage->index_dir, "/.", name, NULL); - if (unlink_directory(index_dir, TRUE) < 0) { + index_storage_destroy_unrefed(); + + /* it can fail with some NFS implementations if indexes are + opened by another session.. can't really help it. */ + if (unlink_directory(index_dir, TRUE) < 0 && + errno != ENOTEMPTY) { mail_storage_set_critical(storage, - "unlink_directory(%s) " - "failed: %m", index_dir); + "unlink_directory(%s) failed: %m", index_dir); return FALSE; } } @@ -443,24 +447,22 @@ while (rename(src, dest) < 0 && count < 2) { if (errno != EEXIST && errno != ENOTEMPTY) { mail_storage_set_critical(storage, - "rename(%s, %s) failed: %m", - src, dest); + "rename(%s, %s) failed: %m", src, dest); return FALSE; } /* ..dir already existed? delete it and try again */ if (unlink_directory(dest, TRUE) < 0) { mail_storage_set_critical(storage, - "unlink_directory(%s) " - "failed: %m", dest); + "unlink_directory(%s) failed: %m", dest); return FALSE; } count++; } - if (unlink_directory(dest, TRUE) < 0) { - mail_storage_set_critical(storage, "unlink_directory(%s) " - "failed: %m", dest); + if (unlink_directory(dest, TRUE) < 0 && errno != ENOTEMPTY) { + mail_storage_set_critical(storage, + "unlink_directory(%s) failed: %m", dest); /* it's already renamed to ..dir, which means it's deleted as far as client is concerned. Report success. */
--- a/src/lib-storage/index/mbox/mbox-storage.c Sat Jun 14 20:22:02 2003 +0300 +++ b/src/lib-storage/index/mbox/mbox-storage.c Sat Jun 14 20:38:06 2003 +0300 @@ -529,12 +529,18 @@ /* next delete the index directory */ index_dir = mbox_get_index_dir(storage, name); - if (index_dir != NULL && - unlink_directory(index_dir, TRUE) < 0 && errno != ENOENT) { - mail_storage_set_critical(storage, - "unlink_directory(%s) failed: %m", index_dir); - /* mailbox itself is deleted, so return success anyway */ + if (index_dir != NULL) { + index_storage_destroy_unrefed(); + + if (unlink_directory(index_dir, TRUE) < 0 && errno != ENOENT) { + mail_storage_set_critical(storage, + "unlink_directory(%s) failed: %m", index_dir); + + /* mailbox itself is deleted, so return success + anyway */ + } } + return TRUE; }