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,
linux-xfs@vger.kernel.org, Goldwyn Rodrigues <rgoldwyn@suse.com>
Subject: [PATCH 02/15] iomap: Read page from srcmap if IOMAP_F_COW is set
Date: Thu, 5 Sep 2019 10:06:37 -0500 [thread overview]
Message-ID: <20190905150650.21089-3-rgoldwyn@suse.de> (raw)
In-Reply-To: <20190905150650.21089-1-rgoldwyn@suse.de>
From: Goldwyn Rodrigues <rgoldwyn@suse.com>
In case of a IOMAP_F_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 | 30 +++++++++++++++++++++---------
include/linux/iomap.h | 3 +++
2 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index f27756c0b31c..560459df75e4 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,24 @@ 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->flags & IOMAP_F_COW) {
+ if (WARN_ON_ONCE(iomap->flags & IOMAP_F_BUFFER_HEAD)) {
+ status = -EIO;
+ goto out_no_page;
+ }
+ if (WARN_ON_ONCE(srcmap->type == IOMAP_HOLE &&
+ srcmap->addr != IOMAP_NULL_ADDR)) {
+ status = -EIO;
+ goto out_no_page;
+ }
+ 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 +784,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 +883,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 +929,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 +973,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;
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 9782a79dde59..7fdb09925740 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -44,6 +44,9 @@ struct vm_fault;
#define IOMAP_F_MERGED 0x10 /* contains multiple blocks/extents */
#define IOMAP_F_SHARED 0x20 /* block shared with another file */
+/* Flags for CoW */
+#define IOMAP_F_COW 0x100 /* copy from srcmap before write */
+
/*
* Flags from 0x1000 up are for file system specific usage:
*/
--
2.16.4
next prev parent reply other threads:[~2019-09-05 15:07 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-05 15:06 [PATCH v4 0/15] CoW support for iomap Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 01/15] iomap: Use a srcmap for a read-modify-write I/O Goldwyn Rodrigues
2019-09-05 23:23 ` Darrick J. Wong
2019-09-05 15:06 ` Goldwyn Rodrigues [this message]
2019-09-05 16:37 ` [PATCH 02/15] iomap: Read page from srcmap if IOMAP_F_COW is set Christoph Hellwig
2019-09-05 20:28 ` Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 03/15] btrfs: Eliminate PagePrivate for btrfs data pages Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 04/15] btrfs: Add a simple buffered iomap write Goldwyn Rodrigues
2019-09-05 16:23 ` Christoph Hellwig
2019-09-05 20:42 ` Goldwyn Rodrigues
2019-09-06 5:54 ` Christoph Hellwig
2019-09-05 15:06 ` [PATCH 05/15] btrfs: Add CoW in iomap based writes Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 06/15] btrfs: remove buffered write code made unnecessary Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 07/15] fs: Export generic_file_buffered_read() Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 08/15] btrfs: basic direct read operation Goldwyn Rodrigues
2019-09-05 16:25 ` Christoph Hellwig
2019-09-05 15:06 ` [PATCH 09/15] btrfs: Carve out btrfs_get_extent_map_write() out of btrfs_get_blocks_write() Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 10/15] btrfs: Rename __endio_write_update_ordered() to btrfs_update_ordered_extent() Goldwyn Rodrigues
2019-09-05 15:06 ` [PATCH 11/15] iomap: use a function pointer for dio submits Goldwyn Rodrigues
2019-09-05 16:27 ` Christoph Hellwig
2019-09-05 23:24 ` Darrick J. Wong
2019-09-05 15:06 ` [PATCH 12/15] btrfs: Use iomap_dio_rw for performing direct I/O writes Goldwyn Rodrigues
2019-09-05 16:31 ` Christoph Hellwig
2019-09-05 15:06 ` [PATCH 13/15] btrfs: Remove btrfs_dio_data and __btrfs_direct_write Goldwyn Rodrigues
2019-09-05 16:32 ` Christoph Hellwig
2019-09-05 15:06 ` [PATCH 14/15] btrfs: update inode size during bio completion Goldwyn Rodrigues
2019-09-05 16:33 ` Christoph Hellwig
2019-09-05 15:06 ` [PATCH 15/15] xfs: Use the new iomap infrastructure for CoW Goldwyn Rodrigues
2019-09-06 16:55 ` Christoph Hellwig
2019-09-06 23:28 ` 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=20190905150650.21089-3-rgoldwyn@suse.de \
--to=rgoldwyn@suse.de \
--cc=darrick.wong@oracle.com \
--cc=hch@lst.de \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=rgoldwyn@suse.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).