From: Timo Sirainen Date: Mon, 11 Aug 2014 12:54:43 +0000 (+0300) Subject: lib: io_stream_copy() no longer attempts to read full block sizes from input. X-Git-Tag: 2.2.14.rc1~172 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=46631c1d903c409444b1b1c4a1d41a033c09ee37;p=thirdparty%2Fdovecot%2Fcore.git lib: io_stream_copy() no longer attempts to read full block sizes from input. Although that may be more efficient for writing (to files), it causes unnecessary work for the input stream. The writing part should also be optimized anyway if the caller corks the output stream. --- diff --git a/src/lib/iostream-temp.c b/src/lib/iostream-temp.c index 06245a6faf..e671b5c531 100644 --- a/src/lib/iostream-temp.c +++ b/src/lib/iostream-temp.c @@ -129,8 +129,7 @@ static int o_stream_temp_dup_cancel(struct temp_ostream *tstream) input = i_stream_create_limit(tstream->dupstream, size); do { - ret = io_stream_copy(&tstream->ostream.ostream, - input, IO_BLOCK_SIZE); + ret = io_stream_copy(&tstream->ostream.ostream, input); } while (input->v_offset < tstream->dupstream_offset && ret > 0); if (ret < 0 && tstream->ostream.ostream.stream_errno == 0) { i_assert(input->stream_errno != 0); @@ -187,8 +186,7 @@ static off_t o_stream_temp_send_istream(struct ostream_private *_outstream, return -1; outstream->flags &= ~IOSTREAM_TEMP_FLAG_TRY_FD_DUP; } - return io_stream_copy(&outstream->ostream.ostream, - instream, IO_BLOCK_SIZE); + return io_stream_copy(&outstream->ostream.ostream, instream); } static int diff --git a/src/lib/ostream-file.c b/src/lib/ostream-file.c index ca01f80f27..b7d19a7207 100644 --- a/src/lib/ostream-file.c +++ b/src/lib/ostream-file.c @@ -857,8 +857,7 @@ static off_t io_stream_copy_stream(struct ostream_private *outstream, } } - return io_stream_copy(&outstream->ostream, instream, - foutstream->optimal_block_size); + return io_stream_copy(&outstream->ostream, instream); } static off_t o_stream_file_send_istream(struct ostream_private *outstream, diff --git a/src/lib/ostream-private.h b/src/lib/ostream-private.h index 7991529ab8..a2e39c3b3a 100644 --- a/src/lib/ostream-private.h +++ b/src/lib/ostream-private.h @@ -46,8 +46,7 @@ struct ostream * o_stream_create(struct ostream_private *_stream, struct ostream *parent, int fd) ATTR_NULL(2); -off_t io_stream_copy(struct ostream *outstream, struct istream *instream, - size_t block_size); +off_t io_stream_copy(struct ostream *outstream, struct istream *instream); void o_stream_copy_error_from_parent(struct ostream_private *_stream); /* This should be called before sending data to parent stream. It makes sure diff --git a/src/lib/ostream.c b/src/lib/ostream.c index 7c02976477..23ccb18509 100644 --- a/src/lib/ostream.c +++ b/src/lib/ostream.c @@ -357,8 +357,7 @@ int o_stream_pwrite(struct ostream *stream, const void *data, size_t size, return ret; } -off_t io_stream_copy(struct ostream *outstream, struct istream *instream, - size_t block_size) +off_t io_stream_copy(struct ostream *outstream, struct istream *instream) { uoff_t start_offset; struct const_iovec iov; @@ -366,9 +365,8 @@ off_t io_stream_copy(struct ostream *outstream, struct istream *instream, ssize_t ret; start_offset = instream->v_offset; - for (;;) { - (void)i_stream_read_data(instream, &data, &iov.iov_len, - block_size-1); + do { + (void)i_stream_read_data(instream, &data, &iov.iov_len, 0); if (iov.iov_len == 0) { /* all sent */ break; @@ -382,10 +380,7 @@ off_t io_stream_copy(struct ostream *outstream, struct istream *instream, return -1; } i_stream_skip(instream, ret); - - if ((size_t)ret != iov.iov_len) - break; - } + } while ((size_t)ret == iov.iov_len); return (off_t)(instream->v_offset - start_offset); } @@ -528,7 +523,7 @@ o_stream_default_write_at(struct ostream_private *_stream, static off_t o_stream_default_send_istream(struct ostream_private *outstream, struct istream *instream) { - return io_stream_copy(&outstream->ostream, instream, IO_BLOCK_SIZE); + return io_stream_copy(&outstream->ostream, instream); } static void o_stream_default_switch_ioloop(struct ostream_private *_stream)