linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dave Kleikamp <dave.kleikamp@oracle.com>
To: linux-fsdevel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Zach Brown <zab@zabbo.net>,
	"Maxim V. Patlasov" <mpatlasov@parallels.com>,
	Dave Kleikamp <dave.kleikamp@oracle.com>
Subject: [PATCH V5 13/30] aio: add aio support for iov_iter arguments
Date: Wed,  9 Jan 2013 13:58:28 -0600	[thread overview]
Message-ID: <1357761525-22718-14-git-send-email-dave.kleikamp@oracle.com> (raw)
In-Reply-To: <1357761525-22718-1-git-send-email-dave.kleikamp@oracle.com>

From: Zach Brown <zab@zabbo.net>

This adds iocb cmds which specify that memory is held in iov_iter
structures.  This lets kernel callers specify memory that can be
expressed in an iov_iter, which includes pages in bio_vec arrays.

Only kernel callers can provide an iov_iter so it doesn't make a lot of
sense to expose the IOCB_CMD values for this as part of the user space
ABI.

But kernel callers should also be able to perform the usual aio
operations which suggests using the the existing operation namespace and
support code.

Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Cc: Zach Brown <zab@zabbo.net>
---
 fs/aio.c                     | 64 ++++++++++++++++++++++++++++++++++++++++++++
 include/linux/aio.h          |  3 +++
 include/uapi/linux/aio_abi.h |  2 ++
 3 files changed, 69 insertions(+)

diff --git a/fs/aio.c b/fs/aio.c
index 9a1a6fc..2c03681 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1424,6 +1424,26 @@ static ssize_t aio_setup_single_vector(int type, struct file * file, struct kioc
 	return 0;
 }
 
+static ssize_t aio_read_iter(struct kiocb *iocb)
+{
+	struct file *file = iocb->ki_filp;
+	ssize_t ret = -EINVAL;
+
+	if (file->f_op->read_iter)
+		ret = file->f_op->read_iter(iocb, iocb->ki_iter, iocb->ki_pos);
+	return ret;
+}
+
+static ssize_t aio_write_iter(struct kiocb *iocb)
+{
+	struct file *file = iocb->ki_filp;
+	ssize_t ret = -EINVAL;
+
+	if (file->f_op->write_iter)
+		ret = file->f_op->write_iter(iocb, iocb->ki_iter, iocb->ki_pos);
+	return ret;
+}
+
 /*
  * aio_setup_iocb:
  *	Performs the initial checks and aio retry method
@@ -1487,6 +1507,34 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
 		if (file->f_op->aio_write)
 			kiocb->ki_retry = aio_rw_vect_retry;
 		break;
+	case IOCB_CMD_READ_ITER:
+		ret = -EINVAL;
+		if (unlikely(!is_kernel_kiocb(kiocb)))
+			break;
+		ret = -EBADF;
+		if (unlikely(!(file->f_mode & FMODE_READ)))
+			break;
+		ret = security_file_permission(file, MAY_READ);
+		if (unlikely(ret))
+			break;
+		ret = -EINVAL;
+		if (file->f_op->read_iter)
+			kiocb->ki_retry = aio_read_iter;
+		break;
+	case IOCB_CMD_WRITE_ITER:
+		ret = -EINVAL;
+		if (unlikely(!is_kernel_kiocb(kiocb)))
+			break;
+		ret = -EBADF;
+		if (unlikely(!(file->f_mode & FMODE_WRITE)))
+			break;
+		ret = security_file_permission(file, MAY_WRITE);
+		if (unlikely(ret))
+			break;
+		ret = -EINVAL;
+		if (file->f_op->write_iter)
+			kiocb->ki_retry = aio_write_iter;
+		break;
 	case IOCB_CMD_FDSYNC:
 		ret = -EINVAL;
 		if (file->f_op->aio_fsync)
@@ -1553,6 +1601,22 @@ void aio_kernel_init_rw(struct kiocb *iocb, struct file *filp,
 }
 EXPORT_SYMBOL_GPL(aio_kernel_init_rw);
 
+/*
+ * The iter count must be set before calling here.  Some filesystems uses
+ * iocb->ki_left as an indicator of the size of an IO.
+ */
+void aio_kernel_init_iter(struct kiocb *iocb, struct file *filp,
+			  unsigned short op, struct iov_iter *iter, loff_t off)
+{
+	iocb->ki_filp = filp;
+	iocb->ki_iter = iter;
+	iocb->ki_opcode = op;
+	iocb->ki_pos = off;
+	iocb->ki_nbytes = iov_iter_count(iter);
+	iocb->ki_left = iocb->ki_nbytes;
+}
+EXPORT_SYMBOL_GPL(aio_kernel_init_iter);
+
 void aio_kernel_init_callback(struct kiocb *iocb,
 			      void (*complete)(u64 user_data, long res),
 			      u64 user_data)
diff --git a/include/linux/aio.h b/include/linux/aio.h
index f9e0292..2598e6c 100644
--- a/include/linux/aio.h
+++ b/include/linux/aio.h
@@ -126,6 +126,7 @@ struct kiocb {
 	 * this is the underlying eventfd context to deliver events to.
 	 */
 	struct eventfd_ctx	*ki_eventfd;
+	struct iov_iter		*ki_iter;
 };
 
 static inline bool is_sync_kiocb(struct kiocb *kiocb)
@@ -229,6 +230,8 @@ struct kiocb *aio_kernel_alloc(gfp_t gfp);
 void aio_kernel_free(struct kiocb *iocb);
 void aio_kernel_init_rw(struct kiocb *iocb, struct file *filp,
 			unsigned short op, void *ptr, size_t nr, loff_t off);
+void aio_kernel_init_iter(struct kiocb *iocb, struct file *filp,
+			  unsigned short op, struct iov_iter *iter, loff_t off);
 void aio_kernel_init_callback(struct kiocb *iocb,
 			      void (*complete)(u64 user_data, long res),
 			      u64 user_data);
diff --git a/include/uapi/linux/aio_abi.h b/include/uapi/linux/aio_abi.h
index 86fa7a7..bd39bb2 100644
--- a/include/uapi/linux/aio_abi.h
+++ b/include/uapi/linux/aio_abi.h
@@ -44,6 +44,8 @@ enum {
 	IOCB_CMD_NOOP = 6,
 	IOCB_CMD_PREADV = 7,
 	IOCB_CMD_PWRITEV = 8,
+	IOCB_CMD_READ_ITER = 9,
+	IOCB_CMD_WRITE_ITER = 10,
 };
 
 /*
-- 
1.8.1

  parent reply	other threads:[~2013-01-09 19:58 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-09 19:58 [PATCH V5 00/30] loop: Issue O_DIRECT aio using bio_vec Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 01/30] iov_iter: move into its own file Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 02/30] iov_iter: iov_iter_copy_from_user() should use non-atomic copy Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 03/30] iov_iter: add copy_to_user support Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 05/30] iov_iter: hide iovec details behind ops function pointers Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 06/30] iov_iter: add bvec support Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 07/30] iov_iter: add a shorten call Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 08/30] iov_iter: let callers extract iovecs and bio_vecs Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 09/30] dio: Convert direct_IO to use iov_iter Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 10/30] dio: add bio_vec support to __blockdev_direct_IO() Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 11/30] fs: pull iov_iter use higher up the stack Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 12/30] aio: add aio_kernel_() interface Dave Kleikamp
2013-01-09 19:58 ` Dave Kleikamp [this message]
2013-01-09 19:58 ` [PATCH V5 14/30] bio: add bvec_length(), like iov_length() Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 15/30] loop: use aio to perform io on the underlying file Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 16/30] fs: create file_readable() and file_writable() functions Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 17/30] fs: use read_iter and write_iter rather than aio_read and aio_write Dave Kleikamp
2013-01-18 21:26   ` Jeff Moyer
2013-01-18 22:03     ` Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 18/30] fs: add read_iter and write_iter to several file systems Dave Kleikamp
2013-01-10 12:40   ` Boaz Harrosh
2013-01-09 19:58 ` [PATCH V5 19/30] ocfs2: add support for read_iter, write_iter, and direct_IO_bvec Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 20/30] ext4: add support for read_iter and write_iter Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 21/30] nfs: add support for read_iter, write_iter Dave Kleikamp
     [not found] ` <1357761525-22718-1-git-send-email-dave.kleikamp-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2013-01-09 19:58   ` [PATCH V5 04/30] fuse: convert fuse to use iov_iter_copy_[to|from]_user Dave Kleikamp
2013-01-09 19:58   ` [PATCH V5 22/30] nfs: simplify swap Dave Kleikamp
2013-01-09 20:01     ` Rik van Riel
2013-01-09 19:58 ` [PATCH V5 23/30] btrfs: add support for read_iter and write_iter Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 24/30] block_dev: add support for read_iter, write_iter Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 25/30] xfs: add support for read_iter and write_iter Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 26/30] gfs2: Convert aio_read/write ops to read/write_iter Dave Kleikamp
2013-01-10 10:10   ` Steven Whitehouse
2013-01-10 14:34     ` Dave Kleikamp
2013-01-11 16:24       ` Steven Whitehouse
2013-01-09 19:58 ` [PATCH V5 27/30] udf: convert file ops from aio_read/write " Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 28/30] afs: add support for read_iter and write_iter Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 29/30] ecrpytfs: Convert aio_read/write ops to read/write_iter Dave Kleikamp
2013-01-09 19:58 ` [PATCH V5 30/30] ubifs: convert file ops from aio_read/write " Dave Kleikamp
2013-01-10 15:46 ` [PATCH V5 00/30] loop: Issue O_DIRECT aio using bio_vec Sedat Dilek
2013-01-11 21:51   ` Dave Kleikamp
2013-01-12 10:52     ` Sedat Dilek
2013-01-12 12:54       ` Sedat Dilek
2013-01-16 16:32 ` James Bottomley
2013-01-16 18:25   ` Sedat Dilek
2013-01-17 23:49     ` James Bottomley
2013-01-18 17:16 ` Jeff Moyer
2013-01-18 17:56   ` Jeff Moyer
2013-01-18 17:58     ` Dave Kleikamp
2013-01-18 21:48       ` Jeff Moyer
2013-01-18 22:33         ` Dave Kleikamp
2013-01-22 16:14           ` Jeff Moyer
2013-01-20 22:26   ` Dave Chinner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1357761525-22718-14-git-send-email-dave.kleikamp@oracle.com \
    --to=dave.kleikamp@oracle.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mpatlasov@parallels.com \
    --cc=zab@zabbo.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).