]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Don't call msync() with with in-memory indexes.
authorTimo Sirainen <tss@iki.fi>
Wed, 23 Apr 2003 17:07:23 +0000 (20:07 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 23 Apr 2003 17:07:23 +0000 (20:07 +0300)
--HG--
branch : HEAD

src/lib-index/mail-index-data.c
src/lib-index/mail-index.c
src/lib-index/mail-tree.c
src/lib-index/maildir/maildir-rebuild.c
src/lib-index/mbox/mbox-rebuild.c

index 3b8682039c70f56dbc3c236c2e9a54211ee388db..c5f3885cf51ec03c94bcd2455b812de92cd06099 100644 (file)
@@ -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;
index efca129961cc96f5b26e754fd75e5ea8370d450f..32430fd72e0a0f05d8d1aafa6f3b9c5566d42a25 100644 (file)
@@ -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,
index 4d7f70b0968efa56613886ec8894513b14a7da7b..75d173cb45ad39eeee68a322f4419ec7521426f1 100644 (file)
@@ -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;
index 3adc269bce06d77cde926d174201502e0ebca01d..f031c33140af096f43ce84bb51d26b8c282b2492 100644 (file)
@@ -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))
index d24fe162ff6eb6335048d63bb63890d2ab04e93e..0e857a64484c6e30951f36bac11cc802b2ef47c3 100644 (file)
@@ -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))