diff --git a/fs/vfs/fs_read.c b/fs/vfs/fs_read.c index f6b40a0f6fd..5e4f3e789b9 100644 --- a/fs/vfs/fs_read.c +++ b/fs/vfs/fs_read.c @@ -68,42 +68,36 @@ static ssize_t file_readv_compat(FAR struct file *filep, { /* Ignore zero-length reads */ - if (iov[i].iov_len > 0) + if (iov[i].iov_len == 0) { - buffer = iov[i].iov_base; - remaining = iov[i].iov_len; - - /* Read repeatedly as necessary to fill buffer */ - - do - { - nread = inode->u.i_ops->read(filep, (void *)buffer, - remaining); - - /* Check for a read error */ - - if (nread < 0) - { - return ntotal ? ntotal : nread; - } - - /* Check for an end-of-file condition */ - - else if (nread == 0) - { - return ntotal; - } - - /* Update pointers and counts in order to handle partial - * buffer reads. - */ - - buffer += nread; - remaining -= nread; - ntotal += nread; - } - while (remaining > 0); + continue; } + + buffer = iov[i].iov_base; + remaining = iov[i].iov_len; + + nread = inode->u.i_ops->read(filep, (void *)buffer, remaining); + + /* Check for a read error */ + + if (nread < 0) + { + return ntotal ? ntotal : nread; + } + + ntotal += nread; + + /* Check for a parital success condition, including an end-of-file */ + + if (nread < remaining) + { + return ntotal; + } + + /* Update the pointer */ + + buffer += nread; + remaining -= nread; } return ntotal; diff --git a/fs/vfs/fs_write.c b/fs/vfs/fs_write.c index 41ce33cf0f3..e8b33bf5b45 100644 --- a/fs/vfs/fs_write.c +++ b/fs/vfs/fs_write.c @@ -68,35 +68,36 @@ static ssize_t file_writev_compat(FAR struct file *filep, { /* Ignore zero-length writes */ - if (iov[i].iov_len > 0) + if (iov[i].iov_len == 0) { - buffer = iov[i].iov_base; - remaining = iov[i].iov_len; - - /* Write repeatedly as necessary to write the entire buffer */ - - do - { - nwritten = inode->u.i_ops->write(filep, (void *)buffer, - remaining); - - /* Check for a write error */ - - if (nwritten < 0) - { - return ntotal ? ntotal : nwritten; - } - - /* Update pointers and counts in order to handle partial - * buffer writes. - */ - - buffer += nwritten; - remaining -= nwritten; - ntotal += nwritten; - } - while (remaining > 0); + continue; } + + buffer = iov[i].iov_base; + remaining = iov[i].iov_len; + + nwritten = inode->u.i_ops->write(filep, (void *)buffer, remaining); + + /* Check for a write error */ + + if (nwritten < 0) + { + return ntotal ? ntotal : nwritten; + } + + ntotal += nwritten; + + /* Check for a parital success condition */ + + if (nwritten < remaining) + { + return ntotal; + } + + /* Update the pointer */ + + buffer += nwritten; + remaining -= nwritten; } return ntotal;