|
@@ -150,33 +150,24 @@ static ssize_t hypfs_aio_read(struct kiocb *iocb, const struct iovec *iov,
|
|
|
unsigned long nr_segs, loff_t offset)
|
|
|
{
|
|
|
char *data;
|
|
|
- size_t len;
|
|
|
+ ssize_t ret;
|
|
|
struct file *filp = iocb->ki_filp;
|
|
|
/* XXX: temporary */
|
|
|
char __user *buf = iov[0].iov_base;
|
|
|
size_t count = iov[0].iov_len;
|
|
|
|
|
|
- if (nr_segs != 1) {
|
|
|
- count = -EINVAL;
|
|
|
- goto out;
|
|
|
- }
|
|
|
+ if (nr_segs != 1)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
data = filp->private_data;
|
|
|
- len = strlen(data);
|
|
|
- if (offset > len) {
|
|
|
- count = 0;
|
|
|
- goto out;
|
|
|
- }
|
|
|
- if (count > len - offset)
|
|
|
- count = len - offset;
|
|
|
- if (copy_to_user(buf, data + offset, count)) {
|
|
|
- count = -EFAULT;
|
|
|
- goto out;
|
|
|
- }
|
|
|
- iocb->ki_pos += count;
|
|
|
+ ret = simple_read_from_buffer(buf, count, &offset, data, strlen(data));
|
|
|
+ if (ret <= 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ iocb->ki_pos += ret;
|
|
|
file_accessed(filp);
|
|
|
-out:
|
|
|
- return count;
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
static ssize_t hypfs_aio_write(struct kiocb *iocb, const struct iovec *iov,
|
|
|
unsigned long nr_segs, loff_t offset)
|