From 0fc012960458b0a7921837d9ba4f44944bf92ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 18 Oct 2005 19:51:47 +0000 Subject: [PATCH] Fixed another stupid bug in all readv()/writev() versions: the position of the read/write access was only correct for the first entry in the iovec. These functions should be updated to use read_pages()/write_pages() where possible, anyway - right now, they only save some kernel calls, while they could be processed by the device at once. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14413 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/fs/fd.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/fs/fd.c b/src/system/kernel/fs/fd.c index 2b0c2b6616..dd77f44468 100644 --- a/src/system/kernel/fs/fd.c +++ b/src/system/kernel/fs/fd.c @@ -469,12 +469,13 @@ _user_readv(int fd, off_t pos, const iovec *userVecs, size_t count) else bytesRead += (ssize_t)length; - descriptor->pos = pos + length; + pos += vecs[i].iov_len; } } else bytesRead = B_BAD_VALUE; status = bytesRead; + descriptor->pos = pos; err2: free(vecs); @@ -571,12 +572,13 @@ _user_writev(int fd, off_t pos, const iovec *userVecs, size_t count) else bytesWritten += (ssize_t)length; - descriptor->pos = pos + length; + pos += vecs[i].iov_len; } } else bytesWritten = B_BAD_VALUE; status = bytesWritten; + descriptor->pos = pos; err2: free(vecs); @@ -775,11 +777,12 @@ _kern_readv(int fd, off_t pos, const iovec *vecs, size_t count) else bytesRead += (ssize_t)length; - descriptor->pos = pos + length; + pos += vecs[i].iov_len; } } else bytesRead = B_BAD_VALUE; + descriptor->pos = pos; put_fd(descriptor); return bytesRead; } @@ -853,11 +856,12 @@ _kern_writev(int fd, off_t pos, const iovec *vecs, size_t count) else bytesWritten += (ssize_t)length; - descriptor->pos = pos + length; + pos += vecs[i].iov_len; } } else bytesWritten = B_BAD_VALUE; + descriptor->pos = pos; put_fd(descriptor); return bytesWritten; }