From 74fbdec334e6e5a4d0fc9c9d2e11415a15892d4c Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 23 Apr 2003 20:07:23 +0300 Subject: [PATCH] Don't call msync() with with in-memory indexes. --HG-- branch : HEAD --- src/lib-index/mail-index-data.c | 34 ++++++++++++++----------- src/lib-index/mail-index.c | 16 +++++++----- src/lib-index/mail-tree.c | 2 +- src/lib-index/maildir/maildir-rebuild.c | 8 +++--- src/lib-index/mbox/mbox-rebuild.c | 8 +++--- 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/lib-index/mail-index-data.c b/src/lib-index/mail-index-data.c index 3b8682039c..c5f3885cf5 100644 --- a/src/lib-index/mail-index-data.c +++ b/src/lib-index/mail-index-data.c @@ -76,14 +76,25 @@ static int index_data_set_syscall_error(struct mail_index_data *data, return FALSE; } -static void mail_index_data_file_close(struct mail_index_data *data) +static int mail_index_data_msync(struct mail_index_data *data) { - if (data->modified) { + if (!data->modified) + return TRUE; + + if (!data->anon_mmap) { if (msync(data->mmap_base, data->mmap_used_length, MS_SYNC) < 0) - index_data_set_syscall_error(data, "msync()"); - data->modified = FALSE; + return index_data_set_syscall_error(data, "msync()"); } + data->modified = FALSE; + data->fsynced = FALSE; + return TRUE; +} + +static void mail_index_data_file_close(struct mail_index_data *data) +{ + (void)mail_index_data_msync(data); + if (data->anon_mmap) { if (munmap_anon(data->mmap_base, data->mmap_full_length) < 0) index_data_set_syscall_error(data, "munmap_anon()"); @@ -164,11 +175,8 @@ static int mmap_update(struct mail_index_data *data, uoff_t pos, size_t size) i_assert(!data->anon_mmap); if (data->mmap_base != NULL) { - if (data->modified && - msync(data->mmap_base, data->mmap_used_length, MS_SYNC) < 0) - return index_data_set_syscall_error(data, "msync()"); - data->modified = FALSE; - data->fsynced = FALSE; + if (!mail_index_data_msync(data)) + return FALSE; if (munmap(data->mmap_base, data->mmap_full_length) < 0) index_data_set_syscall_error(data, "munmap()"); @@ -504,12 +512,8 @@ int mail_index_data_sync_file(struct mail_index_data *data, int *fsync_fd) if (data->anon_mmap) return TRUE; - if (data->modified) { - if (msync(data->mmap_base, data->mmap_used_length, MS_SYNC) < 0) - return index_data_set_syscall_error(data, "msync()"); - - data->fsynced = FALSE; - } + if (!mail_index_data_msync(data)) + return FALSE; if (!data->fsynced) { data->fsynced = TRUE; diff --git a/src/lib-index/mail-index.c b/src/lib-index/mail-index.c index efca129961..32430fd72e 100644 --- a/src/lib-index/mail-index.c +++ b/src/lib-index/mail-index.c @@ -261,7 +261,7 @@ static void mail_index_update_header_changes(struct mail_index *index) static int mail_index_write_header_changes(struct mail_index *index) { - int failed; + int failed = FALSE; /* use our own locking here so we don't mess up with any other index states, like inconsistency. */ @@ -275,10 +275,13 @@ static int mail_index_write_header_changes(struct mail_index *index) mail_index_update_header_changes(index); - failed = msync(index->mmap_base, - sizeof(struct mail_index_header), MS_SYNC) < 0; - if (failed) - index_set_syscall_error(index, "msync()"); + if (!index->anon_mmap) { + if (msync(index->mmap_base, + sizeof(struct mail_index_header), MS_SYNC) < 0) { + index_set_syscall_error(index, "msync()"); + failed = TRUE; + } + } #ifdef DEBUG mprotect(index->mmap_base, index->mmap_used_length, PROT_NONE); @@ -446,7 +449,8 @@ static int mail_index_lock_full(struct mail_index *index, /* remove the FSCK flag only after successful fsync() */ if (mail_index_sync_file(index) && !keep_fsck) { index->header->flags &= ~MAIL_INDEX_FLAG_FSCK; - if (msync(index->mmap_base, + if (!index->anon_mmap && + msync(index->mmap_base, sizeof(struct mail_index_header), MS_SYNC) < 0) { /* we only failed to remove the fsck flag, diff --git a/src/lib-index/mail-tree.c b/src/lib-index/mail-tree.c index 4d7f70b096..75d173cb45 100644 --- a/src/lib-index/mail-tree.c +++ b/src/lib-index/mail-tree.c @@ -55,7 +55,7 @@ static int mmap_update(struct mail_tree *tree) if (tree->mmap_base != NULL) { /* make sure we're synced before munmap() */ - if (tree->modified && + if (!tree->anon_mmap && tree->modified && msync(tree->mmap_base, tree->mmap_highwater, MS_SYNC) < 0) return tree_set_syscall_error(tree, "msync()"); tree->modified = FALSE; diff --git a/src/lib-index/maildir/maildir-rebuild.c b/src/lib-index/maildir/maildir-rebuild.c index 3adc269bce..f031c33140 100644 --- a/src/lib-index/maildir/maildir-rebuild.c +++ b/src/lib-index/maildir/maildir-rebuild.c @@ -28,9 +28,11 @@ int maildir_index_rebuild(struct mail_index *index) index->inconsistent = TRUE; index->rebuilding = TRUE; - if (msync(index->mmap_base, - sizeof(struct mail_index_header), MS_SYNC) < 0) - return FALSE; + if (!index->anon_mmap) { + if (msync(index->mmap_base, + sizeof(struct mail_index_header), MS_SYNC) < 0) + return index_set_syscall_error(index, "msync()"); + } /* reset data file */ if (!mail_index_data_reset(index->data)) diff --git a/src/lib-index/mbox/mbox-rebuild.c b/src/lib-index/mbox/mbox-rebuild.c index d24fe162ff..0e857a6448 100644 --- a/src/lib-index/mbox/mbox-rebuild.c +++ b/src/lib-index/mbox/mbox-rebuild.c @@ -32,9 +32,11 @@ int mbox_index_rebuild(struct mail_index *index) if (index->opened) index->inconsistent = TRUE; - if (msync(index->mmap_base, - sizeof(struct mail_index_header), MS_SYNC) < 0) - return index_set_syscall_error(index, "msync()"); + if (!index->anon_mmap) { + if (msync(index->mmap_base, + sizeof(struct mail_index_header), MS_SYNC) < 0) + return index_set_syscall_error(index, "msync()"); + } /* reset data file */ if (!mail_index_data_reset(index->data)) -- 2.47.3