From: Timo Sirainen Date: Sat, 1 May 2004 16:22:54 +0000 (+0300) Subject: missing index file fixes X-Git-Tag: 1.1.alpha1~4163 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ec0ca7ff13595daf0d096c17100afb352e6294a;p=thirdparty%2Fdovecot%2Fcore.git missing index file fixes --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-fsck.c b/src/lib-index/mail-index-fsck.c index 95d2869a20..04f6c3400f 100644 --- a/src/lib-index/mail-index-fsck.c +++ b/src/lib-index/mail-index-fsck.c @@ -130,6 +130,6 @@ int mail_index_fsck(struct mail_index *index) index->filepath, error); } if (ret == 0) - mail_index_reset(index); + mail_index_mark_corrupted(index); return ret; } diff --git a/src/lib-index/mail-index-lock.c b/src/lib-index/mail-index-lock.c index 5a1c1bcd23..e9f5283b28 100644 --- a/src/lib-index/mail-index-lock.c +++ b/src/lib-index/mail-index-lock.c @@ -106,7 +106,7 @@ static int mail_index_has_changed(struct mail_index *index) return -1; /* lost it? recreate */ - (void)mail_index_reset(index); + (void)mail_index_mark_corrupted(index); return -1; } diff --git a/src/lib-index/mail-index-private.h b/src/lib-index/mail-index-private.h index fcc9d8a667..4f79678051 100644 --- a/src/lib-index/mail-index-private.h +++ b/src/lib-index/mail-index-private.h @@ -128,6 +128,7 @@ int mail_index_sync_get_rec(struct mail_index_view *view, const void *data, size_t *data_offset); void mail_index_set_inconsistent(struct mail_index *index); +int mail_index_mark_corrupted(struct mail_index *index); int mail_index_set_error(struct mail_index *index, const char *fmt, ...) __attr_format__(2, 3); diff --git a/src/lib-index/mail-index-reset.c b/src/lib-index/mail-index-reset.c index ec608fcd2d..626902af02 100644 --- a/src/lib-index/mail-index-reset.c +++ b/src/lib-index/mail-index-reset.c @@ -36,6 +36,7 @@ static int mail_index_mark_corrupted(struct mail_index *index) int mail_index_reset(struct mail_index *index) { + struct mail_transaction_log *log; struct mail_index_header hdr; uint32_t file_seq; uoff_t file_offset; @@ -48,19 +49,23 @@ int mail_index_reset(struct mail_index *index) if (mail_index_mark_corrupted(index) < 0) return -1; - log_locked = index->log_locked; + /*log_locked = index->log_locked; if (log_locked) mail_transaction_log_sync_unlock(index->log); - mail_index_close(index); - if (mail_index_open(index, MAIL_INDEX_OPEN_FLAG_CREATE) < 0) + log = index->log; + mail_index_close(index); + index->log = log; + + if (mail_index_open(index, MAIL_INDEX_OPEN_FLAG_CREATE | + MAIL_INDEX_OPEN_FLAG_REOPEN) < 0) return -1; if (log_locked) { if (mail_transaction_log_sync_lock(index->log, &file_seq, &file_offset) < 0) return -1; - } + }*/ return 0; } diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index 672c7f04b8..2666079918 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -655,6 +655,34 @@ void mail_index_set_inconsistent(struct mail_index *index) index->indexid = 0; } +int mail_index_mark_corrupted(struct mail_index *index) +{ + struct mail_index_header hdr; + + if (index->readonly) + return 0; + + /* make sure we can write the header */ + if (!MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) { + if (mprotect(index->map->mmap_base, sizeof(hdr), + PROT_READ | PROT_WRITE) < 0) { + mail_index_set_syscall_error(index, "mprotect()"); + return -1; + } + } + + hdr = *index->hdr; + hdr.flags |= MAIL_INDEX_HDR_FLAG_CORRUPTED; + if (mail_index_write_header(index, &hdr) < 0) + return -1; + + if (fsync(index->fd) < 0) + return mail_index_set_syscall_error(index, "fsync()"); + + mail_index_set_inconsistent(index); + return 0; +} + int mail_index_set_syscall_error(struct mail_index *index, const char *function) {