Wrapfs: support asynchronous-IO (AIO) operations
authorErez Zadok <ezk@cs.sunysb.edu>
Sat, 21 Jun 2014 00:28:12 +0000 (20:28 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 27 Dec 2016 03:11:38 +0000 (22:11 -0500)
Signed-off-by: Li Mengyang <li.mengyang@stonybrook.edu>
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/wrapfs/file.c

index 2b8309a957ba99f74d99bb4918246bb02b940670..4776dbe4fcd73f7cab8ae6fdced02fce275992fd 100644 (file)
@@ -263,6 +263,48 @@ static int wrapfs_fasync(int fd, struct file *file, int flag)
        return err;
 }
 
+static ssize_t wrapfs_aio_read(struct kiocb *iocb, const struct iovec *iov,
+                              unsigned long nr_segs, loff_t pos)
+{
+       int err = -EINVAL;
+       struct file *file, *lower_file;
+
+       file = iocb->ki_filp;
+       lower_file = wrapfs_lower_file(file);
+       if (!lower_file->f_op->aio_read)
+               goto out;
+       /*
+        * It appears safe to rewrite this iocb, because in
+        * do_io_submit@fs/aio.c, iocb is a just copy from user.
+        */
+       iocb->ki_filp = lower_file;
+       err = lower_file->f_op->aio_read(iocb, iov, nr_segs, pos);
+       iocb->ki_filp = file;
+out:
+       return err;
+}
+
+static ssize_t wrapfs_aio_write(struct kiocb *iocb, const struct iovec *iov,
+                               unsigned long nr_segs, loff_t pos)
+{
+       int err = -EINVAL;
+       struct file *file, *lower_file;
+
+       file = iocb->ki_filp;
+       lower_file = wrapfs_lower_file(file);
+       if (!lower_file->f_op->aio_write)
+               goto out;
+       /*
+        * It appears safe to rewrite this iocb, because in
+        * do_io_submit@fs/aio.c, iocb is a just copy from user.
+        */
+       iocb->ki_filp = lower_file;
+       err = lower_file->f_op->aio_write(iocb, iov, nr_segs, pos);
+       iocb->ki_filp = file;
+out:
+       return err;
+}
+
 const struct file_operations wrapfs_main_fops = {
        .llseek         = generic_file_llseek,
        .read           = wrapfs_read,
@@ -277,6 +319,8 @@ const struct file_operations wrapfs_main_fops = {
        .release        = wrapfs_file_release,
        .fsync          = wrapfs_fsync,
        .fasync         = wrapfs_fasync,
+       .aio_read       = wrapfs_aio_read,
+       .aio_write      = wrapfs_aio_write,
 };
 
 /* trimmed directory options */