From: Goldwyn Rodrigues <rgoldwyn@suse.de>
To: linux-fsdevel@vger.kernel.org
Cc: linux-btrfs@vger.kernel.org, darrick.wong@oracle.com, hch@lst.de,
david@fromorbit.com, riteshh@linux.ibm.com,
Goldwyn Rodrigues <rgoldwyn@suse.com>
Subject: [PATCH 03/15] iomap: Read page from srcmap for IOMAP_COW
Date: Sun, 1 Sep 2019 15:08:24 -0500 [thread overview]
Message-ID: <20190901200836.14959-4-rgoldwyn@suse.de> (raw)
In-Reply-To: <20190901200836.14959-1-rgoldwyn@suse.de>
From: Goldwyn Rodrigues <rgoldwyn@suse.com>
In case of a IOMAP_COW, read a page from the srcmap before
performing a write on the page.
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
---
fs/iomap/buffered-io.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index f27756c0b31c..99d63ba14d1b 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -581,7 +581,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len,
static int
iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags,
- struct page **pagep, struct iomap *iomap)
+ struct page **pagep, struct iomap *iomap, struct iomap *srcmap)
{
const struct iomap_page_ops *page_ops = iomap->page_ops;
pgoff_t index = pos >> PAGE_SHIFT;
@@ -605,12 +605,17 @@ iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags,
goto out_no_page;
}
- if (iomap->type == IOMAP_INLINE)
+ if (iomap->type == IOMAP_INLINE) {
iomap_read_inline_data(inode, page, iomap);
- else if (iomap->flags & IOMAP_F_BUFFER_HEAD)
+ } else if (iomap->type == IOMAP_COW) {
+ iomap_assert(!(iomap->flags & IOMAP_F_BUFFER_HEAD));
+ iomap_assert(srcmap->type == IOMAP_HOLE || srcmap->addr > 0);
+ status = __iomap_write_begin(inode, pos, len, page, srcmap);
+ } else if (iomap->flags & IOMAP_F_BUFFER_HEAD) {
status = __block_write_begin_int(page, pos, len, NULL, iomap);
- else
+ } else {
status = __iomap_write_begin(inode, pos, len, page, iomap);
+ }
if (unlikely(status))
goto out_unlock;
@@ -772,7 +777,7 @@ iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
}
status = iomap_write_begin(inode, pos, bytes, flags, &page,
- iomap);
+ iomap, srcmap);
if (unlikely(status))
break;
@@ -871,7 +876,7 @@ iomap_dirty_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
return PTR_ERR(rpage);
status = iomap_write_begin(inode, pos, bytes,
- AOP_FLAG_NOFS, &page, iomap);
+ AOP_FLAG_NOFS, &page, iomap, srcmap);
put_page(rpage);
if (unlikely(status))
return status;
@@ -917,13 +922,13 @@ iomap_file_dirty(struct inode *inode, loff_t pos, loff_t len,
EXPORT_SYMBOL_GPL(iomap_file_dirty);
static int iomap_zero(struct inode *inode, loff_t pos, unsigned offset,
- unsigned bytes, struct iomap *iomap)
+ unsigned bytes, struct iomap *iomap, struct iomap *srcmap)
{
struct page *page;
int status;
status = iomap_write_begin(inode, pos, bytes, AOP_FLAG_NOFS, &page,
- iomap);
+ iomap, srcmap);
if (status)
return status;
@@ -961,7 +966,7 @@ iomap_zero_range_actor(struct inode *inode, loff_t pos, loff_t count,
if (IS_DAX(inode))
status = iomap_dax_zero(pos, offset, bytes, iomap);
else
- status = iomap_zero(inode, pos, offset, bytes, iomap);
+ status = iomap_zero(inode, pos, offset, bytes, iomap, srcmap);
if (status < 0)
return status;
--
2.16.4
next prev parent reply other threads:[~2019-09-01 20:08 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-01 20:08 [PATCH v3 0/15] Btrfs iomap Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 01/15] iomap: Introduce CONFIG_FS_IOMAP_DEBUG Goldwyn Rodrigues
2019-09-01 20:50 ` Darrick J. Wong
2019-09-02 16:29 ` Christoph Hellwig
2019-09-02 17:09 ` Darrick J. Wong
2019-09-02 17:18 ` Christoph Hellwig
2019-09-03 15:06 ` Darrick J. Wong
2019-09-01 20:08 ` [PATCH 02/15] iomap: Use a IOMAP_COW/srcmap for a read-modify-write I/O Goldwyn Rodrigues
2019-09-02 16:31 ` Christoph Hellwig
2019-09-03 3:18 ` Darrick J. Wong
2019-09-03 14:12 ` Goldwyn Rodrigues
2019-09-03 14:05 ` Goldwyn Rodrigues
2019-09-03 14:56 ` Darrick J. Wong
2019-09-01 20:08 ` Goldwyn Rodrigues [this message]
2019-09-02 16:31 ` [PATCH 03/15] iomap: Read page from srcmap for IOMAP_COW Christoph Hellwig
2019-09-02 17:01 ` Darrick J. Wong
2019-09-02 17:13 ` Christoph Hellwig
2019-09-01 20:08 ` [PATCH 04/15] btrfs: Eliminate PagePrivate for btrfs data pages Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 05/15] btrfs: Add a simple buffered iomap write Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 06/15] btrfs: Add CoW in iomap based writes Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 07/15] btrfs: remove buffered write code made unnecessary Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 08/15] fs: Export generic_file_buffered_read() Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 09/15] btrfs: basic direct read operation Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 10/15] btrfs: Carve out btrfs_get_extent_map_write() out of btrfs_get_blocks_write() Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 11/15] btrfs: Rename __endio_write_update_ordered() to btrfs_update_ordered_extent() Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 12/15] iomap: use a function pointer for dio submits Goldwyn Rodrigues
2019-09-02 16:41 ` Christoph Hellwig
2019-09-01 20:08 ` [PATCH 13/15] btrfs: Use iomap_dio_rw for performing direct I/O writes Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 14/15] btrfs: Remove btrfs_dio_data and __btrfs_direct_write Goldwyn Rodrigues
2019-09-01 20:08 ` [PATCH 15/15] btrfs: update inode size during bio completion Goldwyn Rodrigues
2019-09-02 16:43 ` [PATCH v3 0/15] Btrfs iomap Christoph Hellwig
2019-09-03 3:51 ` Shiyang Ruan
2019-09-03 4:29 ` Darrick J. Wong
2019-09-03 5:00 ` Shiyang Ruan
2019-09-03 6:21 ` Christoph Hellwig
2019-09-03 13:44 ` Goldwyn Rodrigues
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=20190901200836.14959-4-rgoldwyn@suse.de \
--to=rgoldwyn@suse.de \
--cc=darrick.wong@oracle.com \
--cc=david@fromorbit.com \
--cc=hch@lst.de \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=rgoldwyn@suse.com \
--cc=riteshh@linux.ibm.com \
/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).