All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shiyang Ruan <ruansy.fnst@fujitsu.com>
To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>,
	<nvdimm@lists.linux.dev>, <linux-mm@kvack.org>,
	<linux-fsdevel@vger.kernel.org>
Cc: <djwong@kernel.org>, <dan.j.williams@intel.com>,
	<david@fromorbit.com>, <hch@infradead.org>, <jane.chu@oracle.com>,
	<rgoldwyn@suse.de>, <viro@zeniv.linux.org.uk>,
	<willy@infradead.org>, <naoya.horiguchi@nec.com>,
	<linmiaohe@huawei.com>
Subject: [PATCH v11 06/07] xfs: support CoW in fsdax mode
Date: Sun, 8 May 2022 22:36:19 +0800	[thread overview]
Message-ID: <20220508143620.1775214-14-ruansy.fnst@fujitsu.com> (raw)
In-Reply-To: <20220508143620.1775214-1-ruansy.fnst@fujitsu.com>

In fsdax mode, WRITE and ZERO on a shared extent need CoW performed.
After that, new allocated extents needs to be remapped to the file.
So, add a CoW identification in ->iomap_begin(), and implement
->iomap_end() to do the remapping work.

Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
---
 fs/xfs/xfs_file.c  |  7 ++-----
 fs/xfs/xfs_iomap.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 fs/xfs/xfs_iomap.h |  3 +++
 3 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index af954a5b71f8..5a4508b23b51 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -669,7 +669,7 @@ xfs_file_dax_write(
 	pos = iocb->ki_pos;
 
 	trace_xfs_file_dax_write(iocb, from);
-	ret = dax_iomap_rw(iocb, from, &xfs_direct_write_iomap_ops);
+	ret = dax_iomap_rw(iocb, from, &xfs_dax_write_iomap_ops);
 	if (ret > 0 && iocb->ki_pos > i_size_read(inode)) {
 		i_size_write(inode, iocb->ki_pos);
 		error = xfs_setfilesize(ip, pos, ret);
@@ -1285,10 +1285,7 @@ __xfs_filemap_fault(
 		pfn_t pfn;
 
 		xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED);
-		ret = dax_iomap_fault(vmf, pe_size, &pfn, NULL,
-				(write_fault && !vmf->cow_page) ?
-				 &xfs_direct_write_iomap_ops :
-				 &xfs_read_iomap_ops);
+		ret = xfs_dax_fault(vmf, pe_size, write_fault, &pfn);
 		if (ret & VM_FAULT_NEEDDSYNC)
 			ret = dax_finish_sync_fault(vmf, pe_size, pfn);
 		xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED);
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 5a393259a3a3..e35842215d22 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -27,6 +27,7 @@
 #include "xfs_dquot_item.h"
 #include "xfs_dquot.h"
 #include "xfs_reflink.h"
+#include "linux/dax.h"
 
 #define XFS_ALLOC_ALIGN(mp, off) \
 	(((off) >> mp->m_allocsize_log) << mp->m_allocsize_log)
@@ -773,7 +774,8 @@ xfs_direct_write_iomap_begin(
 
 		/* may drop and re-acquire the ilock */
 		error = xfs_reflink_allocate_cow(ip, &imap, &cmap, &shared,
-				&lockmode, flags & IOMAP_DIRECT);
+				&lockmode,
+				(flags & IOMAP_DIRECT) || IS_DAX(inode));
 		if (error)
 			goto out_unlock;
 		if (shared)
@@ -867,6 +869,33 @@ const struct iomap_ops xfs_direct_write_iomap_ops = {
 	.iomap_begin		= xfs_direct_write_iomap_begin,
 };
 
+static int
+xfs_dax_write_iomap_end(
+	struct inode		*inode,
+	loff_t			pos,
+	loff_t			length,
+	ssize_t			written,
+	unsigned		flags,
+	struct iomap		*iomap)
+{
+	struct xfs_inode	*ip = XFS_I(inode);
+
+	if (!xfs_is_cow_inode(ip))
+		return 0;
+
+	if (!written) {
+		xfs_reflink_cancel_cow_range(ip, pos, length, true);
+		return 0;
+	}
+
+	return xfs_reflink_end_cow(ip, pos, written);
+}
+
+const struct iomap_ops xfs_dax_write_iomap_ops = {
+	.iomap_begin	= xfs_direct_write_iomap_begin,
+	.iomap_end	= xfs_dax_write_iomap_end,
+};
+
 static int
 xfs_buffered_write_iomap_begin(
 	struct inode		*inode,
@@ -1358,3 +1387,18 @@ xfs_truncate_page(
 	return iomap_truncate_page(inode, pos, did_zero,
 				   &xfs_buffered_write_iomap_ops);
 }
+
+#ifdef CONFIG_FS_DAX
+int
+xfs_dax_fault(
+	struct vm_fault		*vmf,
+	enum page_entry_size	pe_size,
+	bool			write_fault,
+	pfn_t			*pfn)
+{
+	return dax_iomap_fault(vmf, pe_size, pfn, NULL,
+			(write_fault && !vmf->cow_page) ?
+				&xfs_dax_write_iomap_ops :
+				&xfs_read_iomap_ops);
+}
+#endif
diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h
index e88dc162c785..89dfa3bb099f 100644
--- a/fs/xfs/xfs_iomap.h
+++ b/fs/xfs/xfs_iomap.h
@@ -25,6 +25,8 @@ int xfs_bmbt_to_iomap(struct xfs_inode *ip, struct iomap *iomap,
 int xfs_zero_range(struct xfs_inode *ip, loff_t pos, loff_t len,
 		bool *did_zero);
 int xfs_truncate_page(struct xfs_inode *ip, loff_t pos, bool *did_zero);
+int xfs_dax_fault(struct vm_fault *vmf, enum page_entry_size pe_size,
+		bool write_fault, pfn_t *pfn);
 
 static inline xfs_filblks_t
 xfs_aligned_fsb_count(
@@ -51,5 +53,6 @@ extern const struct iomap_ops xfs_direct_write_iomap_ops;
 extern const struct iomap_ops xfs_read_iomap_ops;
 extern const struct iomap_ops xfs_seek_iomap_ops;
 extern const struct iomap_ops xfs_xattr_iomap_ops;
+extern const struct iomap_ops xfs_dax_write_iomap_ops;
 
 #endif /* __XFS_IOMAP_H__*/
-- 
2.35.1




  parent reply	other threads:[~2022-05-08 14:36 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-08 14:36 [PATCHSETS] v14 fsdax-rmap + v11 fsdax-reflink Shiyang Ruan
2022-05-08 14:36 ` [PATCH v14 01/07] dax: Introduce holder for dax_device Shiyang Ruan
2022-05-08 14:36 ` [PATCH v14 02/07] mm: factor helpers for memory_failure_dev_pagemap Shiyang Ruan
2022-05-08 14:36 ` [PATCH v14 03/07] pagemap,pmem: Introduce ->memory_failure() Shiyang Ruan
2022-05-08 14:36 ` [PATCH v14 04/07] fsdax: Introduce dax_lock_mapping_entry() Shiyang Ruan
2022-05-08 14:36 ` [PATCH v14 05/07] mm: Introduce mf_dax_kill_procs() for fsdax case Shiyang Ruan
2022-05-08 14:36 ` [PATCH v14 06/07] xfs: Implement ->notify_failure() for XFS Shiyang Ruan
2022-05-08 14:36 ` [PATCH v14 07/07] fsdax: set a CoW flag when associate reflink mappings Shiyang Ruan
2022-05-08 14:36 ` [PATCH v11 01/07] fsdax: Output address in dax_iomap_pfn() and rename it Shiyang Ruan
2022-05-08 14:36 ` [PATCH v11 02/07] fsdax: Introduce dax_iomap_cow_copy() Shiyang Ruan
2022-05-08 14:36 ` [PATCH v11 03/07] fsdax: Replace mmap entry in case of CoW Shiyang Ruan
2022-05-08 14:36 ` [PATCH v11 04/07] fsdax: Add dax_iomap_cow_copy() for dax zero Shiyang Ruan
2022-05-08 14:36 ` [PATCH v11 05/07] fsdax: Dedup file range to use a compare function Shiyang Ruan
2022-05-08 14:36 ` Shiyang Ruan [this message]
2022-05-10  5:45   ` [PATCH v11 06/07] xfs: support CoW in fsdax mode Christoph Hellwig
2022-05-10 10:06     ` Shiyang Ruan
2022-05-11  2:25   ` [PATCH v11.1 " Shiyang Ruan
2022-05-08 14:36 ` [PATCH v11 07/07] xfs: Add dax dedupe support Shiyang Ruan
2022-05-10  9:32 ` [PATCHSETS] v14 fsdax-rmap + v11 fsdax-reflink Christoph Hellwig
2022-05-11  0:03 ` Darrick J. Wong
2022-05-11  1:48   ` Dave Chinner
2022-05-11  1:55     ` Dan Williams
2022-05-11  2:19       ` Dave Chinner
2022-05-11  2:28       ` Andrew Morton
2022-05-11  2:43         ` Darrick J. Wong
2022-05-11  5:24           ` Andrew Morton
2022-05-11  6:21             ` Dave Chinner
2022-05-11 15:19             ` Darrick J. Wong
2022-05-11 15:46               ` Dan Williams
2022-05-12 12:27                 ` Shiyang Ruan
2022-06-02  9:42                   ` Shiyang Ruan
2022-06-02 17:18                     ` Darrick J. Wong
2022-06-02 17:47                       ` Andrew Morton
2022-05-11  4:20         ` Dan Williams
2022-05-11  4:34           ` Darrick J. Wong
2022-06-02 18:56 ` Andrew Morton
2022-06-03  1:07   ` Shiyang Ruan
2022-06-03  1:36     ` Shiyang Ruan

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=20220508143620.1775214-14-ruansy.fnst@fujitsu.com \
    --to=ruansy.fnst@fujitsu.com \
    --cc=dan.j.williams@intel.com \
    --cc=david@fromorbit.com \
    --cc=djwong@kernel.org \
    --cc=hch@infradead.org \
    --cc=jane.chu@oracle.com \
    --cc=linmiaohe@huawei.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=naoya.horiguchi@nec.com \
    --cc=nvdimm@lists.linux.dev \
    --cc=rgoldwyn@suse.de \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willy@infradead.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.