Mercurial > dovecot > core-2.2
changeset 14333:a3b162331cd1
dbox: Avoid unnecessary fstat() call during file creation.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 13 Mar 2012 17:01:56 +0200 |
parents | 37d6dd0f053b |
children | 6cb102aa5d63 |
files | src/lib-storage/index/dbox-common/dbox-file.c src/lib-storage/index/dbox-common/dbox-file.h src/lib-storage/index/dbox-multi/mdbox-file.c src/lib-storage/index/dbox-single/sdbox-file.c |
diffstat | 4 files changed, 4 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-common/dbox-file.c Tue Mar 13 16:32:56 2012 +0200 +++ b/src/lib-storage/index/dbox-common/dbox-file.c Tue Mar 13 17:01:56 2012 +0200 @@ -588,7 +588,7 @@ return 0; } - if (ctx->output->offset == 0) { + if (ctx->output->offset == 0 && !file->created) { /* first append to existing file. seek to eof first. */ if (fstat(file->fd, &st) < 0) { dbox_file_set_syscall_error(file, "fstat()");
--- a/src/lib-storage/index/dbox-common/dbox-file.h Tue Mar 13 16:32:56 2012 +0200 +++ b/src/lib-storage/index/dbox-common/dbox-file.h Tue Mar 13 17:01:56 2012 +0200 @@ -116,6 +116,7 @@ ARRAY_DEFINE(metadata, const char *); uoff_t metadata_read_offset; + unsigned int created:1; /* this file is now being created */ unsigned int appending:1; unsigned int deleted:1; unsigned int corrupted:1;
--- a/src/lib-storage/index/dbox-multi/mdbox-file.c Tue Mar 13 16:32:56 2012 +0200 +++ b/src/lib-storage/index/dbox-multi/mdbox-file.c Tue Mar 13 17:01:56 2012 +0200 @@ -106,6 +106,7 @@ bool create_parents; int ret; + _file->created = TRUE; create_parents = dbox_file_is_in_alt(_file); _file->fd = _file->storage->v. file_create_fd(_file, _file->cur_path, create_parents);
--- a/src/lib-storage/index/dbox-single/sdbox-file.c Tue Mar 13 16:32:56 2012 +0200 +++ b/src/lib-storage/index/dbox-single/sdbox-file.c Tue Mar 13 17:01:56 2012 +0200 @@ -60,6 +60,7 @@ struct dbox_file *file; file = sdbox_file_init(mbox, 0); + file->created = TRUE; file->fd = file->storage->v. file_create_fd(file, file->primary_path, FALSE); return file;