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>, Christoph Hellwig <hch@lst.de>
Subject: [PATCH v11.1 06/07] xfs: support CoW in fsdax mode
Date: Wed, 11 May 2022 10:25:17 +0800	[thread overview]
Message-ID: <20220511022517.2087361-1-ruansy.fnst@fujitsu.com> (raw)
In-Reply-To: <20220508143620.1775214-14-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>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/xfs_file.c  | 33 ++++++++++++++++++++++++++++-----
 fs/xfs/xfs_iomap.c | 30 +++++++++++++++++++++++++++++-
 fs/xfs/xfs_iomap.h |  1 +
 3 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index af954a5b71f8..fe9f92586acf 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -25,6 +25,7 @@
 #include "xfs_iomap.h"
 #include "xfs_reflink.h"
 
+#include <linux/dax.h>
 #include <linux/falloc.h>
 #include <linux/backing-dev.h>
 #include <linux/mman.h>
@@ -669,7 +670,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);
@@ -1254,6 +1255,31 @@ xfs_file_llseek(
 	return vfs_setpos(file, offset, inode->i_sb->s_maxbytes);
 }
 
+#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);
+}
+#else
+int
+xfs_dax_fault(
+	struct vm_fault		*vmf,
+	enum page_entry_size	pe_size,
+	bool			write_fault,
+	pfn_t			*pfn)
+{
+	return 0;
+}
+#endif
+
 /*
  * Locking for serialisation of IO during page faults. This results in a lock
  * ordering of:
@@ -1285,10 +1311,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..4c07f5e718fb 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -773,7 +773,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 +868,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,
diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h
index e88dc162c785..c782e8c0479c 100644
--- a/fs/xfs/xfs_iomap.h
+++ b/fs/xfs/xfs_iomap.h
@@ -51,5 +51,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-11  2:25 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 ` [PATCH v11 06/07] xfs: support CoW in fsdax mode Shiyang Ruan
2022-05-10  5:45   ` Christoph Hellwig
2022-05-10 10:06     ` Shiyang Ruan
2022-05-11  2:25   ` Shiyang Ruan [this message]
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=20220511022517.2087361-1-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=hch@lst.de \
    --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.