Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6390:ff48b008150f HEAD
Fix ESTALE handling when reading main index.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 15 Sep 2007 15:18:45 +0300 |
parents | abbea4e5c128 |
children | c5cff3c6828a |
files | src/lib-index/mail-index-map.c src/lib-index/mail-index-private.h src/lib-index/mail-index.c |
diffstat | 3 files changed, 10 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ 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 @@ 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 @@ } 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 @@ 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); }
--- 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 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);
--- 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 @@ 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);