From 96edbd128f596f34c5af3c5a730402043360a0e3 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 25 Mar 2008 21:10:21 +0000 Subject: [PATCH] [PXEXT] Avoid queueing zero-length buffers in posix_io.c read_user() assumes that zero-length buffers don't exist, and optimises around this. --- src/core/posix_io.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/core/posix_io.c b/src/core/posix_io.c index b48c1f80..e0459bdf 100644 --- a/src/core/posix_io.c +++ b/src/core/posix_io.c @@ -114,7 +114,7 @@ static void posix_file_xfer_close ( struct xfer_interface *xfer, int rc ) { static int posix_file_xfer_deliver_iob ( struct xfer_interface *xfer, struct io_buffer *iobuf, - struct xfer_metadata *meta __unused ) { + struct xfer_metadata *meta ) { struct posix_file *file = container_of ( xfer, struct posix_file, xfer ); @@ -125,7 +125,12 @@ posix_file_xfer_deliver_iob ( struct xfer_interface *xfer, if ( file->filesize < file->pos ) file->filesize = file->pos; - list_add_tail ( &iobuf->list, &file->data ); + if ( iob_len ( iobuf ) ) { + list_add_tail ( &iobuf->list, &file->data ); + } else { + free_iob ( iobuf ); + } + return 0; } @@ -293,14 +298,15 @@ ssize_t read_user ( int fd, userptr_t buffer, off_t offset, size_t max_len ) { free_iob ( iobuf ); } file->pos += len; - if ( len ) - return len; - break; + assert ( len != 0 ); + return len; } /* If file has completed, return (after returning all data) */ - if ( file->rc != -EINPROGRESS ) + if ( file->rc != -EINPROGRESS ) { + assert ( list_empty ( &file->data ) ); return file->rc; + } /* No data ready and file still in progress; return -WOULDBLOCK */ return -EWOULDBLOCK;