changeset 1387:dfa23fc2f370 HEAD

Don't call msync() with with in-memory indexes.
author Timo Sirainen <tss@iki.fi>
date Wed, 23 Apr 2003 20:07:23 +0300
parents 5d16da99b537
children 683a8202c037
files 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
diffstat 5 files changed, 41 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-data.c	Wed Apr 23 19:52:10 2003 +0300
+++ b/src/lib-index/mail-index-data.c	Wed Apr 23 20:07:23 2003 +0300
@@ -76,13 +76,24 @@
 	return FALSE;
 }
 
+static int mail_index_data_msync(struct mail_index_data *data)
+{
+	if (!data->modified)
+		return TRUE;
+
+	if (!data->anon_mmap) {
+		if (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;
+	return TRUE;
+}
+
 static void mail_index_data_file_close(struct mail_index_data *data)
 {
-	if (data->modified) {
-		if (msync(data->mmap_base, data->mmap_used_length, MS_SYNC) < 0)
-			index_data_set_syscall_error(data, "msync()");
-		data->modified = FALSE;
-	}
+	(void)mail_index_data_msync(data);
 
 	if (data->anon_mmap) {
 		if (munmap_anon(data->mmap_base, data->mmap_full_length) < 0)
@@ -164,11 +175,8 @@
 	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 @@
 	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;
--- a/src/lib-index/mail-index.c	Wed Apr 23 19:52:10 2003 +0300
+++ b/src/lib-index/mail-index.c	Wed Apr 23 20:07:23 2003 +0300
@@ -261,7 +261,7 @@
 
 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 @@
 
 	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 @@
 		/* 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,
--- a/src/lib-index/mail-tree.c	Wed Apr 23 19:52:10 2003 +0300
+++ b/src/lib-index/mail-tree.c	Wed Apr 23 20:07:23 2003 +0300
@@ -55,7 +55,7 @@
 
 	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;
--- a/src/lib-index/maildir/maildir-rebuild.c	Wed Apr 23 19:52:10 2003 +0300
+++ b/src/lib-index/maildir/maildir-rebuild.c	Wed Apr 23 20:07:23 2003 +0300
@@ -28,9 +28,11 @@
 	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))
--- a/src/lib-index/mbox/mbox-rebuild.c	Wed Apr 23 19:52:10 2003 +0300
+++ b/src/lib-index/mbox/mbox-rebuild.c	Wed Apr 23 20:07:23 2003 +0300
@@ -32,9 +32,11 @@
 	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))