dovecot: Delayed lseek()/pwrite() fixes.

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 2 19:06:40 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/22398d619cac
changeset: 6164:22398d619cac
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 02 19:06:34 2007 +0300
description:
Delayed lseek()/pwrite() fixes.

diffstat:

1 file changed, 15 insertions(+), 8 deletions(-)
src/lib/ostream-file.c |   23 +++++++++++++++--------

diffs (111 lines):

diff -r 48dbfdba4e24 -r 22398d619cac src/lib/ostream-file.c
--- a/src/lib/ostream-file.c	Thu Aug 02 18:37:31 2007 +0300
+++ b/src/lib/ostream-file.c	Thu Aug 02 19:06:34 2007 +0300
@@ -33,6 +33,7 @@ struct file_ostream {
 
 	int fd;
 	struct io *io;
+	uoff_t buffer_offset;
 	uoff_t real_offset;
 
 	unsigned char *buffer; /* ring-buffer */
@@ -136,43 +137,42 @@ static void o_stream_socket_cork(struct 
 
 static int o_stream_lseek(struct file_ostream *fstream)
 {
-	uoff_t offset = fstream->ostream.ostream.offset;
 	off_t ret;
 
-	if (fstream->real_offset == offset)
+	if (fstream->real_offset == fstream->buffer_offset)
 		return 0;
 
-	ret = lseek(fstream->fd, (off_t)offset, SEEK_SET);
+	ret = lseek(fstream->fd, (off_t)fstream->buffer_offset, SEEK_SET);
 	if (ret < 0) {
 		fstream->ostream.ostream.stream_errno = errno;
 		return -1;
 	}
 
-	if (ret != (off_t)offset) {
+	if (ret != (off_t)fstream->buffer_offset) {
 		fstream->ostream.ostream.stream_errno = EINVAL;
 		return -1;
 	}
-	fstream->real_offset = offset;
+	fstream->real_offset = fstream->buffer_offset;
 	return 0;
 }
 
 static ssize_t o_stream_writev(struct file_ostream *fstream,
 			       const struct const_iovec *iov, int iov_size)
 {
-	uoff_t offset = fstream->ostream.ostream.offset;
 	ssize_t ret;
 	size_t size, sent;
 	int i;
 
 	o_stream_socket_cork(fstream);
 	if (iov_size == 1) {
-		if (!fstream->file || fstream->real_offset == offset) {
+		if (!fstream->file ||
+		    fstream->real_offset == fstream->buffer_offset) {
 			ret = write(fstream->fd, iov->iov_base, iov->iov_len);
 			if (ret > 0)
 				fstream->real_offset += ret;
 		} else {
 			ret = pwrite(fstream->fd, iov->iov_base, iov->iov_len,
-				     offset);
+				     fstream->buffer_offset);
 		}
 	} else {
 		if (o_stream_lseek(fstream) < 0)
@@ -190,6 +190,7 @@ static ssize_t o_stream_writev(struct fi
 				break;
 
 			fstream->real_offset += ret;
+			fstream->buffer_offset += ret;
 			sent += ret;
 			iov += IOV_MAX;
 			iov_size -= IOV_MAX;
@@ -213,6 +214,7 @@ static ssize_t o_stream_writev(struct fi
 		return -1;
 	}
 
+	fstream->buffer_offset += ret;
 	return ret;
 }
 
@@ -340,6 +342,7 @@ static int _seek(struct _ostream *stream
 
 	stream->ostream.stream_errno = 0;
 	stream->ostream.offset = offset;
+	fstream->buffer_offset = offset;
 	return 1;
 }
 
@@ -557,6 +560,8 @@ static off_t io_stream_sendfile(struct _
 		}
 
 		v_offset += ret;
+		foutstream->real_offset += ret;
+		foutstream->buffer_offset += ret;
 		outstream->ostream.offset += ret;
 	} while ((uoff_t)ret != send_size);
 
@@ -818,6 +823,7 @@ o_stream_create_fd(int fd, size_t max_bu
 	if (offset >= 0) {
 		ostream->offset = offset;
 		fstream->real_offset = offset;
+		fstream->buffer_offset = offset;
 		fstream_init_file(fstream);
 	} else {
 		if (net_getsockname(fd, NULL, NULL) < 0) {
@@ -845,6 +851,7 @@ o_stream_create_fd_file(int fd, uoff_t o
 	fstream_init_file(fstream);
 	fstream->max_buffer_size = fstream->optimal_block_size;
 	fstream->real_offset = offset;
+	fstream->buffer_offset = offset;
 
 	ostream = _o_stream_create(&fstream->ostream);
 	ostream->offset = offset;


More information about the dovecot-cvs mailing list