[PATCH] Vectorize aio_read/aio_write fileop methods
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / read_write.c
index d4cb3183c99cb9c89ccb5b1bc2f98c4e976087d8..679dd535380fe541cb7a93c1b64771957ab507d3 100644 (file)
@@ -227,14 +227,20 @@ static void wait_on_retry_sync_kiocb(struct kiocb *iocb)
 
 ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
 {
+       struct iovec iov = { .iov_base = buf, .iov_len = len };
        struct kiocb kiocb;
        ssize_t ret;
 
        init_sync_kiocb(&kiocb, filp);
        kiocb.ki_pos = *ppos;
-       while (-EIOCBRETRY ==
-               (ret = filp->f_op->aio_read(&kiocb, buf, len, kiocb.ki_pos)))
+       kiocb.ki_left = len;
+
+       for (;;) {
+               ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos);
+               if (ret != -EIOCBRETRY)
+                       break;
                wait_on_retry_sync_kiocb(&kiocb);
+       }
 
        if (-EIOCBQUEUED == ret)
                ret = wait_on_sync_kiocb(&kiocb);
@@ -279,14 +285,20 @@ EXPORT_SYMBOL(vfs_read);
 
 ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
 {
+       struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
        struct kiocb kiocb;
        ssize_t ret;
 
        init_sync_kiocb(&kiocb, filp);
        kiocb.ki_pos = *ppos;
-       while (-EIOCBRETRY ==
-              (ret = filp->f_op->aio_write(&kiocb, buf, len, kiocb.ki_pos)))
+       kiocb.ki_left = len;
+
+       for (;;) {
+               ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);
+               if (ret != -EIOCBRETRY)
+                       break;
                wait_on_retry_sync_kiocb(&kiocb);
+       }
 
        if (-EIOCBQUEUED == ret)
                ret = wait_on_sync_kiocb(&kiocb);