From: Timo Sirainen Date: Mon, 9 Mar 2015 19:27:51 +0000 (+0200) Subject: lib-fs: Optimized fs_stat() for fs-metawrap after writing a file. X-Git-Tag: 2.2.16~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7b2e5e2a2bcbb45d150579b84b7a8a307b58c4a;p=thirdparty%2Fdovecot%2Fcore.git lib-fs: Optimized fs_stat() for fs-metawrap after writing a file. --- diff --git a/src/lib-fs/fs-metawrap.c b/src/lib-fs/fs-metawrap.c index 8e7aaadb48..06cb64ff3a 100644 --- a/src/lib-fs/fs-metawrap.c +++ b/src/lib-fs/fs-metawrap.c @@ -354,6 +354,8 @@ fs_metawrap_create_updated_istream(struct metawrap_fs_file *file, input2 = i_stream_create_concat(inputs); i_stream_unref(&inputs[0]); i_stream_unref(&inputs[1]); + + file->metadata_write_size = str_len(file->metadata_header); return input2; } @@ -450,6 +452,16 @@ static int fs_metawrap_stat(struct fs_file *_file, struct stat *st_r) if (!file->fs->wrap_metadata) return fs_stat(file->super, st_r); + + if (file->metadata_write_size != 0) { + /* fs_stat() after a write. we can do this quickly. */ + if (fs_stat(file->super, st_r) < 0) + return -1; + i_assert((uoff_t)st_r->st_size > file->metadata_write_size); + st_r->st_size -= file->metadata_write_size; + return 0; + } + input = fs_read_stream(_file, IO_BLOCK_SIZE); if ((ret = i_stream_get_size(input, TRUE, &input_size)) < 0) { fs_set_error(_file->fs, "i_stream_get_size(%s) failed: %m",