dovecot: Fix ESTALE handling when reading main index.

dovecot at dovecot.org dovecot at dovecot.org
Sat Sep 15 15:18:59 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/ff48b008150f
changeset: 6390:ff48b008150f
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Sep 15 15:18:45 2007 +0300
description:
Fix ESTALE handling when reading main index.

diffstat:

3 files changed, 10 insertions(+), 6 deletions(-)
src/lib-index/mail-index-map.c     |   13 ++++++++-----
src/lib-index/mail-index-private.h |    1 +
src/lib-index/mail-index.c         |    2 +-

diffs (67 lines):

diff -r abbea4e5c128 -r ff48b008150f src/lib-index/mail-index-map.c
--- a/src/lib-index/mail-index-map.c	Sat Sep 15 15:17:57 2007 +0300
+++ b/src/lib-index/mail-index-map.c	Sat Sep 15 15:18:45 2007 +0300
@@ -688,7 +688,8 @@ mail_index_try_read_map(struct mail_inde
 	return 1;
 }
 
-static int mail_index_read_map(struct mail_index_map *map, uoff_t file_size)
+static int mail_index_read_map(struct mail_index_map *map, uoff_t file_size,
+			       unsigned int *lock_id)
 {
 	struct mail_index *index = map->index;
 	mail_index_sync_lost_handler_t *const *handlers;
@@ -716,9 +717,8 @@ static int mail_index_read_map(struct ma
 			break;
 
 		/* ESTALE - reopen index file */
-                if (close(index->fd) < 0)
-			mail_index_set_syscall_error(index, "close()");
-		index->fd = -1;
+		mail_index_close_file(index);
+		*lock_id = 0;
 
                 ret = mail_index_try_open_only(index);
 		if (ret <= 0) {
@@ -729,6 +729,9 @@ static int mail_index_read_map(struct ma
 			}
 			return -1;
 		}
+		if (mail_index_lock_shared(index, lock_id) < 0)
+			return -1;
+
 		if (fstat(index->fd, &st) == 0)
 			file_size = st.st_size;
 		else {
@@ -826,7 +829,7 @@ static int mail_index_map_latest_file(st
 		new_map->rec_map->lock_id = lock_id;
 		ret = mail_index_mmap(new_map, file_size);
 	} else {
-		ret = mail_index_read_map(new_map, file_size);
+		ret = mail_index_read_map(new_map, file_size, &lock_id);
 		mail_index_unlock(index, &lock_id);
 	}
 
diff -r abbea4e5c128 -r ff48b008150f src/lib-index/mail-index-private.h
--- a/src/lib-index/mail-index-private.h	Sat Sep 15 15:17:57 2007 +0300
+++ b/src/lib-index/mail-index-private.h	Sat Sep 15 15:18:45 2007 +0300
@@ -237,6 +237,7 @@ int mail_index_create_tmp_file(struct ma
 int mail_index_create_tmp_file(struct mail_index *index, const char **path_r);
 
 int mail_index_try_open_only(struct mail_index *index);
+void mail_index_close_file(struct mail_index *index);
 int mail_index_reopen_if_changed(struct mail_index *index);
 /* Update/rewrite the main index file from index->map */
 void mail_index_write(struct mail_index *index, bool want_rotate);
diff -r abbea4e5c128 -r ff48b008150f src/lib-index/mail-index.c
--- a/src/lib-index/mail-index.c	Sat Sep 15 15:17:57 2007 +0300
+++ b/src/lib-index/mail-index.c	Sat Sep 15 15:18:45 2007 +0300
@@ -402,7 +402,7 @@ int mail_index_open(struct mail_index *i
 	return 1;
 }
 
-static void mail_index_close_file(struct mail_index *index)
+void mail_index_close_file(struct mail_index *index)
 {
 	if (index->file_lock != NULL)
 		file_lock_free(&index->file_lock);


More information about the dovecot-cvs mailing list