From: Dave Kleikamp <dave.kleikamp@oracle.com>
To: linux-fsdevel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Zach Brown <zab@zabbo.net>,
Dave Kleikamp <dave.kleikamp@oracle.com>,
Chris Mason <chris.mason@oracle.com>,
linux-btrfs@vger.kernel.org
Subject: [RFC PATCH 21/22] btrfs: add support for read_iter, write_iter, and direct_IO_bvec
Date: Mon, 27 Feb 2012 15:19:35 -0600 [thread overview]
Message-ID: <1330377576-3659-22-git-send-email-dave.kleikamp@oracle.com> (raw)
In-Reply-To: <1330377576-3659-1-git-send-email-dave.kleikamp@oracle.com>
Some helpers were broken out of btrfs_direct_IO() in order to avoid code
duplication in new bio_vec-based function.
Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
Cc: Zach Brown <zab@zabbo.net>
Cc: Chris Mason <chris.mason@oracle.com>
Cc: linux-btrfs@vger.kernel.org
---
fs/btrfs/file.c | 2 +
fs/btrfs/inode.c | 116 +++++++++++++++++++++++++++++++++++++-----------------
2 files changed, 82 insertions(+), 36 deletions(-)
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 859ba2d..7a2fbc0 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1880,6 +1880,8 @@ const struct file_operations btrfs_file_operations = {
.aio_read = generic_file_aio_read,
.splice_read = generic_file_splice_read,
.aio_write = btrfs_file_aio_write,
+ .read_iter = generic_file_read_iter,
+ .write_iter = generic_file_write_iter,
.mmap = btrfs_file_mmap,
.open = generic_file_open,
.release = btrfs_release_file,
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 32214fe..52199e7 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -6151,24 +6151,14 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io
out:
return retval;
}
-static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
- const struct iovec *iov, loff_t offset,
- unsigned long nr_segs)
+
+static ssize_t btrfs_pre_direct_IO(int writing, loff_t offset, size_t count,
+ struct inode *inode, int *write_bits)
{
- struct file *file = iocb->ki_filp;
- struct inode *inode = file->f_mapping->host;
struct btrfs_ordered_extent *ordered;
struct extent_state *cached_state = NULL;
u64 lockstart, lockend;
ssize_t ret;
- int writing = rw & WRITE;
- int write_bits = 0;
- size_t count = iov_length(iov, nr_segs);
-
- if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov,
- offset, nr_segs)) {
- return 0;
- }
lockstart = offset;
lockend = offset + count - 1;
@@ -6176,7 +6166,7 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
if (writing) {
ret = btrfs_delalloc_reserve_space(inode, count);
if (ret)
- goto out;
+ return ret;
}
while (1) {
@@ -6191,8 +6181,8 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
lockend - lockstart + 1);
if (!ordered)
break;
- unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart, lockend,
- &cached_state, GFP_NOFS);
+ unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart,
+ lockend, &cached_state, GFP_NOFS);
btrfs_start_ordered_extent(inode, ordered, 1);
btrfs_put_ordered_extent(ordered);
cond_resched();
@@ -6203,46 +6193,99 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
* the dirty or uptodate bits
*/
if (writing) {
- write_bits = EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING;
- ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend,
- EXTENT_DELALLOC, 0, NULL, &cached_state,
- GFP_NOFS);
- if (ret) {
+ *write_bits = EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING;
+ ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart,
+ lockend, EXTENT_DELALLOC, 0, NULL,
+ &cached_state, GFP_NOFS);
+ if (ret)
clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart,
- lockend, EXTENT_LOCKED | write_bits,
+ lockend, EXTENT_LOCKED | *write_bits,
1, 0, &cached_state, GFP_NOFS);
- goto out;
- }
}
-
free_extent_state(cached_state);
- cached_state = NULL;
- ret = __blockdev_direct_IO(rw, iocb, inode,
- BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
- iov, offset, nr_segs, btrfs_get_blocks_direct, NULL,
- btrfs_submit_direct, 0);
+ return ret;
+}
+
+static ssize_t btrfs_post_direct_IO(ssize_t ret, loff_t offset, size_t count,
+ struct inode *inode, int *write_bits)
+{
+ struct extent_state *cached_state = NULL;
if (ret < 0 && ret != -EIOCBQUEUED) {
clear_extent_bit(&BTRFS_I(inode)->io_tree, offset,
- offset + iov_length(iov, nr_segs) - 1,
- EXTENT_LOCKED | write_bits, 1, 0,
+ offset + count - 1,
+ EXTENT_LOCKED | *write_bits, 1, 0,
&cached_state, GFP_NOFS);
- } else if (ret >= 0 && ret < iov_length(iov, nr_segs)) {
+ } else if (ret >= 0 && ret < count) {
/*
* We're falling back to buffered, unlock the section we didn't
* do IO on.
*/
clear_extent_bit(&BTRFS_I(inode)->io_tree, offset + ret,
- offset + iov_length(iov, nr_segs) - 1,
- EXTENT_LOCKED | write_bits, 1, 0,
+ offset + count - 1,
+ EXTENT_LOCKED | *write_bits, 1, 0,
&cached_state, GFP_NOFS);
}
-out:
free_extent_state(cached_state);
return ret;
}
+static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
+ const struct iovec *iov, loff_t offset,
+ unsigned long nr_segs)
+{
+ struct file *file = iocb->ki_filp;
+ struct inode *inode = file->f_mapping->host;
+ ssize_t ret;
+ int writing = rw & WRITE;
+ int write_bits = 0;
+ size_t count = iov_length(iov, nr_segs);
+
+ if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov,
+ offset, nr_segs)) {
+ return 0;
+ }
+
+ ret = btrfs_pre_direct_IO(writing, offset, count, inode, &write_bits);
+ if (ret)
+ return ret;
+
+ ret = __blockdev_direct_IO(rw, iocb, inode,
+ BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
+ iov, offset, nr_segs, btrfs_get_blocks_direct, NULL,
+ btrfs_submit_direct, 0);
+
+ ret = btrfs_post_direct_IO(ret, offset, iov_length(iov, nr_segs),
+ inode, &write_bits);
+ return ret;
+}
+
+static ssize_t btrfs_direct_IO_bvec(int rw, struct kiocb *iocb,
+ struct bio_vec *bvec, loff_t offset,
+ unsigned long bvec_len)
+{
+ struct file *file = iocb->ki_filp;
+ struct inode *inode = file->f_mapping->host;
+ ssize_t ret;
+ int writing = rw & WRITE;
+ int write_bits = 0;
+ size_t count = bvec_length(bvec, bvec_len);
+
+ ret = btrfs_pre_direct_IO(writing, offset, count, inode, &write_bits);
+ if (ret)
+ return ret;
+
+ ret = __blockdev_direct_IO_bvec(rw, iocb, inode,
+ BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
+ bvec, offset, bvec_len, btrfs_get_blocks_direct, NULL,
+ btrfs_submit_direct, 0);
+
+ ret = btrfs_post_direct_IO(ret, offset, bvec_length(bvec, bvec_len),
+ inode, &write_bits);
+ return ret;
+}
+
static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
__u64 start, __u64 len)
{
@@ -7433,6 +7476,7 @@ static const struct address_space_operations btrfs_aops = {
.writepages = btrfs_writepages,
.readpages = btrfs_readpages,
.direct_IO = btrfs_direct_IO,
+ .direct_IO_bvec = btrfs_direct_IO_bvec,
.invalidatepage = btrfs_invalidatepage,
.releasepage = btrfs_releasepage,
.set_page_dirty = btrfs_set_page_dirty,
--
1.7.9.2
next prev parent reply other threads:[~2012-02-27 21:19 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-27 21:19 [RFC PATCH 00/22] loop: Issue O_DIRECT aio with pages Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 01/22] iov_iter: move into its own file Dave Kleikamp
2012-03-01 20:25 ` Jeff Moyer
2012-02-27 21:19 ` [RFC PATCH 02/22] iov_iter: add copy_to_user support Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 03/22] fuse: convert fuse to use iov_iter_copy_[to|from]_user Dave Kleikamp
[not found] ` <1330377576-3659-4-git-send-email-dave.kleikamp-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2012-02-28 9:09 ` Miklos Szeredi
2012-02-27 21:19 ` [RFC PATCH 04/22] iov_iter: hide iovec details behind ops function pointers Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 05/22] iov_iter: add bvec support Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 06/22] iov_iter: add a shorten call Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 07/22] iov_iter: let callers extract iovecs and bio_vecs Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 08/22] dio: create a dio_aligned() helper function Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 09/22] dio: add dio_alloc_init() " Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 10/22] dio: add sdio_init() " Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 11/22] dio: add dio_lock_and_flush() helper Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 12/22] dio: add dio_post_submission() helper function Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 13/22] dio: add __blockdev_direct_IO_bdev() Dave Kleikamp
2012-02-27 22:16 ` Zach Brown
2012-02-27 21:19 ` [RFC PATCH 14/22] fs: pull iov_iter use higher up the stack Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 15/22] aio: add aio_kernel_() interface Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 16/22] aio: add aio support for iov_iter arguments Dave Kleikamp
2012-02-27 22:13 ` Zach Brown
2012-02-27 21:19 ` [RFC PATCH 17/22] bio: add bvec_length(), like iov_length() Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 18/22] ext3: add support for .read_iter and .write_iter Dave Kleikamp
2012-02-27 22:34 ` Zach Brown
2012-02-27 23:14 ` Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 19/22] ocfs2: add support for read_iter, write_iter, and direct_IO_bvec Dave Kleikamp
2012-02-27 21:19 ` [RFC PATCH 20/22] ext4: " Dave Kleikamp
2012-02-27 21:19 ` Dave Kleikamp [this message]
2012-02-27 21:19 ` [RFC PATCH 22/22] nfs: add support for read_iter, write_iter Dave Kleikamp
[not found] ` <1330377576-3659-23-git-send-email-dave.kleikamp-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2012-02-27 22:08 ` Myklebust, Trond
2012-02-27 23:17 ` Dave Kleikamp
2012-02-27 22:27 ` [RFC PATCH 00/22] loop: Issue O_DIRECT aio with pages Zach Brown
2012-02-27 22:53 ` Dave Kleikamp
2012-02-28 9:29 ` Christoph Hellwig
2012-02-28 15:14 ` Zach Brown
2012-02-29 9:08 ` Christoph Hellwig
2012-03-01 20:33 ` Jeff Moyer
2012-03-01 20:36 ` 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=1330377576-3659-22-git-send-email-dave.kleikamp@oracle.com \
--to=dave.kleikamp@oracle.com \
--cc=chris.mason@oracle.com \
--cc=linux-btrfs@vger.kernel.org \
--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).