linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dave Kleikamp <dave.kleikamp@oracle.com>
To: Zach Brown <zab@zabbo.net>
Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
	Dave Kleikamp <dave.kleikamp@oracle.com>
Subject: [PATCH V7 -next 09/33] iov_iter: add a shorten call
Date: Fri,  8 Mar 2013 16:52:04 -0600	[thread overview]
Message-ID: <1362783148-22736-10-git-send-email-dave.kleikamp@oracle.com> (raw)
In-Reply-To: <1362783148-22736-1-git-send-email-dave.kleikamp@oracle.com>

From: Zach Brown <zab@zabbo.net>

The generic direct write path wants to shorten its memory vector.  It
does this when it finds that it has to perform a partial write due to
LIMIT_FSIZE.  .direct_IO() always performs IO on all of the referenced
memory because it doesn't have an argument to specify the length of the
IO.

We add an iov_iter operation for this so that the generic path can ask
to shorten the memory vector without having to know what kind it is.
We're happy to shorten the kernel copy of the iovec array, but we refuse
to shorten the bio_vec array and return an error in this case.

Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Cc: Zach Brown <zab@zabbo.net>
---
 fs/iov-iter.c      | 15 +++++++++++++++
 include/linux/fs.h |  5 +++++
 2 files changed, 20 insertions(+)

diff --git a/fs/iov-iter.c b/fs/iov-iter.c
index 5624e36..ec461c8 100644
--- a/fs/iov-iter.c
+++ b/fs/iov-iter.c
@@ -226,6 +226,11 @@ static size_t ii_bvec_single_seg_count(const struct iov_iter *i)
 		return min(i->count, bvec->bv_len - i->iov_offset);
 }
 
+static int ii_bvec_shorten(struct iov_iter *i, size_t count)
+{
+	return -EINVAL;
+}
+
 struct iov_iter_ops ii_bvec_ops = {
 	.ii_copy_to_user_atomic = ii_bvec_copy_to_user_atomic,
 	.ii_copy_to_user = ii_bvec_copy_to_user,
@@ -234,6 +239,7 @@ struct iov_iter_ops ii_bvec_ops = {
 	.ii_advance = ii_bvec_advance,
 	.ii_fault_in_readable = ii_bvec_fault_in_readable,
 	.ii_single_seg_count = ii_bvec_single_seg_count,
+	.ii_shorten = ii_bvec_shorten,
 };
 EXPORT_SYMBOL(ii_bvec_ops);
 #endif	/* CONFIG_BLOCK */
@@ -384,6 +390,14 @@ static size_t ii_iovec_single_seg_count(const struct iov_iter *i)
 		return min(i->count, iov->iov_len - i->iov_offset);
 }
 
+static int ii_iovec_shorten(struct iov_iter *i, size_t count)
+{
+	struct iovec *iov = (struct iovec *)i->data;
+	i->nr_segs = iov_shorten(iov, i->nr_segs, count);
+	i->count = min(i->count, count);
+	return 0;
+}
+
 struct iov_iter_ops ii_iovec_ops = {
 	.ii_copy_to_user_atomic = ii_iovec_copy_to_user_atomic,
 	.ii_copy_to_user = ii_iovec_copy_to_user,
@@ -392,5 +406,6 @@ struct iov_iter_ops ii_iovec_ops = {
 	.ii_advance = ii_iovec_advance,
 	.ii_fault_in_readable = ii_iovec_fault_in_readable,
 	.ii_single_seg_count = ii_iovec_single_seg_count,
+	.ii_shorten = ii_iovec_shorten,
 };
 EXPORT_SYMBOL(ii_iovec_ops);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index a30d174..bd15cdb 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -308,6 +308,7 @@ struct iov_iter_ops {
 	void (*ii_advance)(struct iov_iter *, size_t);
 	int (*ii_fault_in_readable)(struct iov_iter *, size_t);
 	size_t (*ii_single_seg_count)(const struct iov_iter *);
+	int (*ii_shorten)(struct iov_iter *, size_t);
 };
 
 static inline size_t iov_iter_copy_to_user_atomic(struct page *page,
@@ -347,6 +348,10 @@ static inline size_t iov_iter_single_seg_count(const struct iov_iter *i)
 {
 	return i->ops->ii_single_seg_count(i);
 }
+static inline int iov_iter_shorten(struct iov_iter *i, size_t count)
+{
+	return i->ops->ii_shorten(i, count);
+}
 
 #ifdef CONFIG_BLOCK
 extern struct iov_iter_ops ii_bvec_ops;
-- 
1.8.1.5

  parent reply	other threads:[~2013-03-08 22:52 UTC|newest]

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

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=1362783148-22736-10-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=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).