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>,
	<linux-nvdimm@lists.01.org>, <linux-fsdevel@vger.kernel.org>
Cc: darrick.wong@oracle.com, willy@infradead.org, jack@suse.cz,
	viro@zeniv.linux.org.uk, linux-btrfs@vger.kernel.org,
	ocfs2-devel@oss.oracle.com, david@fromorbit.com, hch@lst.de,
	rgoldwyn@suse.de, Goldwyn Rodrigues <rgoldwyn@suse.com>
Subject: [RESEND PATCH v2.1 08/10] fsdax: Dedup file range to use a compare function
Date: Thu, 4 Mar 2021 13:42:21 +0800	[thread overview]
Message-ID: <20210304054221.1148015-1-ruansy.fnst@fujitsu.com> (raw)
In-Reply-To: <20210226002030.653855-9-ruansy.fnst@fujitsu.com>

With dax we cannot deal with readpage() etc. So, we create a dax
comparison funciton which is similar with
vfs_dedupe_file_range_compare().
And introduce dax_remap_file_range_prep() for filesystem use.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com>
---
 fs/dax.c             | 56 ++++++++++++++++++++++++++++++++++++++++++++
 fs/remap_range.c     | 45 ++++++++++++++++++++++++++++-------
 fs/xfs/xfs_reflink.c |  9 +++++--
 include/linux/dax.h  |  4 ++++
 include/linux/fs.h   | 15 ++++++++----
 5 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/fs/dax.c b/fs/dax.c
index 4f6c6ba68e6f..dbb95f00b38b 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1856,3 +1856,59 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf,
 	return dax_insert_pfn_mkwrite(vmf, pfn, order);
 }
 EXPORT_SYMBOL_GPL(dax_finish_sync_fault);
+
+static loff_t dax_range_compare_actor(struct inode *ino1, loff_t pos1,
+		struct inode *ino2, loff_t pos2, loff_t len, void *data,
+		struct iomap *smap, struct iomap *dmap)
+{
+	void *saddr, *daddr;
+	bool *same = data;
+	int ret;
+
+	if (smap->type == IOMAP_HOLE && dmap->type == IOMAP_HOLE) {
+		*same = true;
+		return len;
+	}
+
+	if (smap->type == IOMAP_HOLE || dmap->type == IOMAP_HOLE) {
+		*same = false;
+		return 0;
+	}
+
+	ret = dax_iomap_direct_access(smap, pos1, ALIGN(pos1 + len, PAGE_SIZE),
+				      &saddr, NULL);
+	if (ret < 0)
+		return -EIO;
+
+	ret = dax_iomap_direct_access(dmap, pos2, ALIGN(pos2 + len, PAGE_SIZE),
+				      &daddr, NULL);
+	if (ret < 0)
+		return -EIO;
+
+	*same = !memcmp(saddr, daddr, len);
+	return len;
+}
+
+int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+		struct inode *dest, loff_t destoff, loff_t len, bool *is_same,
+		const struct iomap_ops *ops)
+{
+	int id, ret = 0;
+
+	id = dax_read_lock();
+	while (len) {
+		ret = iomap_apply2(src, srcoff, dest, destoff, len, 0, ops,
+				   is_same, dax_range_compare_actor);
+		if (ret < 0 || !*is_same)
+			goto out;
+
+		len -= ret;
+		srcoff += ret;
+		destoff += ret;
+	}
+	ret = 0;
+out:
+	dax_read_unlock(id);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(dax_dedupe_file_range_compare);
diff --git a/fs/remap_range.c b/fs/remap_range.c
index 77dba3a49e65..9079390edaf3 100644
--- a/fs/remap_range.c
+++ b/fs/remap_range.c
@@ -14,6 +14,7 @@
 #include <linux/compat.h>
 #include <linux/mount.h>
 #include <linux/fs.h>
+#include <linux/dax.h>
 #include "internal.h"
 
 #include <linux/uaccess.h>
@@ -199,9 +200,9 @@ static void vfs_unlock_two_pages(struct page *page1, struct page *page2)
  * Compare extents of two files to see if they are the same.
  * Caller must have locked both inodes to prevent write races.
  */
-static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
-					 struct inode *dest, loff_t destoff,
-					 loff_t len, bool *is_same)
+int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+				  struct inode *dest, loff_t destoff,
+				  loff_t len, bool *is_same)
 {
 	loff_t src_poff;
 	loff_t dest_poff;
@@ -280,6 +281,7 @@ static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
 out_error:
 	return error;
 }
+EXPORT_SYMBOL(vfs_dedupe_file_range_compare);
 
 /*
  * Check that the two inodes are eligible for cloning, the ranges make
@@ -289,9 +291,11 @@ static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
  * If there's an error, then the usual negative error code is returned.
  * Otherwise returns 0 with *len set to the request length.
  */
-int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
-				  struct file *file_out, loff_t pos_out,
-				  loff_t *len, unsigned int remap_flags)
+static int
+__generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				struct file *file_out, loff_t pos_out,
+				loff_t *len, unsigned int remap_flags,
+				const struct iomap_ops *ops)
 {
 	struct inode *inode_in = file_inode(file_in);
 	struct inode *inode_out = file_inode(file_out);
@@ -351,8 +355,15 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
 	if (remap_flags & REMAP_FILE_DEDUP) {
 		bool		is_same = false;
 
-		ret = vfs_dedupe_file_range_compare(inode_in, pos_in,
-				inode_out, pos_out, *len, &is_same);
+		if (!IS_DAX(inode_in) && !IS_DAX(inode_out))
+			ret = vfs_dedupe_file_range_compare(inode_in, pos_in,
+					inode_out, pos_out, *len, &is_same);
+		else if (IS_DAX(inode_in) && IS_DAX(inode_out) && ops)
+			ret = dax_dedupe_file_range_compare(inode_in, pos_in,
+					inode_out, pos_out, *len, &is_same,
+					ops);
+		else
+			return -EINVAL;
 		if (ret)
 			return ret;
 		if (!is_same)
@@ -370,6 +381,24 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
 
 	return ret;
 }
+
+int dax_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+			      struct file *file_out, loff_t pos_out,
+			      loff_t *len, unsigned int remap_flags,
+			      const struct iomap_ops *ops)
+{
+	return __generic_remap_file_range_prep(file_in, pos_in, file_out,
+					       pos_out, len, remap_flags, ops);
+}
+EXPORT_SYMBOL(dax_remap_file_range_prep);
+
+int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				  struct file *file_out, loff_t pos_out,
+				  loff_t *len, unsigned int remap_flags)
+{
+	return __generic_remap_file_range_prep(file_in, pos_in, file_out,
+					       pos_out, len, remap_flags, NULL);
+}
 EXPORT_SYMBOL(generic_remap_file_range_prep);
 
 loff_t do_clone_file_range(struct file *file_in, loff_t pos_in,
diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
index 6fa05fb78189..f5b3a3da36b7 100644
--- a/fs/xfs/xfs_reflink.c
+++ b/fs/xfs/xfs_reflink.c
@@ -1308,8 +1308,13 @@ xfs_reflink_remap_prep(
 	if (IS_DAX(inode_in) || IS_DAX(inode_out))
 		goto out_unlock;
 
-	ret = generic_remap_file_range_prep(file_in, pos_in, file_out, pos_out,
-			len, remap_flags);
+	if (IS_DAX(inode_in))
+		ret = generic_remap_file_range_prep(file_in, pos_in, file_out,
+						    pos_out, len, remap_flags);
+	else
+		ret = dax_remap_file_range_prep(file_in, pos_in, file_out,
+						pos_out, len, remap_flags,
+						&xfs_read_iomap_ops);
 	if (ret || *len == 0)
 		goto out_unlock;
 
diff --git a/include/linux/dax.h b/include/linux/dax.h
index 3275e01ed33d..32e1c34349f2 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -239,6 +239,10 @@ int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
 				      pgoff_t index);
 s64 dax_iomap_zero(loff_t pos, u64 length, struct iomap *iomap,
 		struct iomap *srcmap);
+int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+				  struct inode *dest, loff_t destoff,
+				  loff_t len, bool *is_same,
+				  const struct iomap_ops *ops);
 static inline bool dax_mapping(struct address_space *mapping)
 {
 	return mapping->host && IS_DAX(mapping->host);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index fd47deea7c17..2e6ec5bdf82a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -68,6 +68,7 @@ struct fsverity_info;
 struct fsverity_operations;
 struct fs_context;
 struct fs_parameter_spec;
+struct iomap_ops;
 
 extern void __init inode_init(void);
 extern void __init inode_init_early(void);
@@ -1910,13 +1911,19 @@ extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
 extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
 extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
 				   loff_t, size_t, unsigned int);
+typedef int (*compare_range_t)(struct inode *src, loff_t srcpos,
+			       struct inode *dest, loff_t destpos,
+			       loff_t len, bool *is_same);
 extern ssize_t generic_copy_file_range(struct file *file_in, loff_t pos_in,
 				       struct file *file_out, loff_t pos_out,
 				       size_t len, unsigned int flags);
-extern int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
-					 struct file *file_out, loff_t pos_out,
-					 loff_t *count,
-					 unsigned int remap_flags);
+int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				  struct file *file_out, loff_t pos_out,
+				  loff_t *count, unsigned int remap_flags);
+int dax_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+			      struct file *file_out, loff_t pos_out,
+			      loff_t *len, unsigned int remap_flags,
+			      const struct iomap_ops *ops);
 extern loff_t do_clone_file_range(struct file *file_in, loff_t pos_in,
 				  struct file *file_out, loff_t pos_out,
 				  loff_t len, unsigned int remap_flags);
-- 
2.30.1


_______________________________________________
Linux-nvdimm mailing list -- linux-nvdimm@lists.01.org
To unsubscribe send an email to linux-nvdimm-leave@lists.01.org

WARNING: multiple messages have this Message-ID (diff)
From: Shiyang Ruan <ruansy.fnst@fujitsu.com>
To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>,
	<linux-nvdimm@lists.01.org>, <linux-fsdevel@vger.kernel.org>
Cc: <darrick.wong@oracle.com>, <dan.j.williams@intel.com>,
	<willy@infradead.org>, <jack@suse.cz>, <viro@zeniv.linux.org.uk>,
	<linux-btrfs@vger.kernel.org>, <ocfs2-devel@oss.oracle.com>,
	<david@fromorbit.com>, <hch@lst.de>, <rgoldwyn@suse.de>,
	Goldwyn Rodrigues <rgoldwyn@suse.com>
Subject: [RESEND PATCH v2.1 08/10] fsdax: Dedup file range to use a compare function
Date: Thu, 4 Mar 2021 13:42:21 +0800	[thread overview]
Message-ID: <20210304054221.1148015-1-ruansy.fnst@fujitsu.com> (raw)
In-Reply-To: <20210226002030.653855-9-ruansy.fnst@fujitsu.com>

With dax we cannot deal with readpage() etc. So, we create a dax
comparison funciton which is similar with
vfs_dedupe_file_range_compare().
And introduce dax_remap_file_range_prep() for filesystem use.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com>
---
 fs/dax.c             | 56 ++++++++++++++++++++++++++++++++++++++++++++
 fs/remap_range.c     | 45 ++++++++++++++++++++++++++++-------
 fs/xfs/xfs_reflink.c |  9 +++++--
 include/linux/dax.h  |  4 ++++
 include/linux/fs.h   | 15 ++++++++----
 5 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/fs/dax.c b/fs/dax.c
index 4f6c6ba68e6f..dbb95f00b38b 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1856,3 +1856,59 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf,
 	return dax_insert_pfn_mkwrite(vmf, pfn, order);
 }
 EXPORT_SYMBOL_GPL(dax_finish_sync_fault);
+
+static loff_t dax_range_compare_actor(struct inode *ino1, loff_t pos1,
+		struct inode *ino2, loff_t pos2, loff_t len, void *data,
+		struct iomap *smap, struct iomap *dmap)
+{
+	void *saddr, *daddr;
+	bool *same = data;
+	int ret;
+
+	if (smap->type == IOMAP_HOLE && dmap->type == IOMAP_HOLE) {
+		*same = true;
+		return len;
+	}
+
+	if (smap->type == IOMAP_HOLE || dmap->type == IOMAP_HOLE) {
+		*same = false;
+		return 0;
+	}
+
+	ret = dax_iomap_direct_access(smap, pos1, ALIGN(pos1 + len, PAGE_SIZE),
+				      &saddr, NULL);
+	if (ret < 0)
+		return -EIO;
+
+	ret = dax_iomap_direct_access(dmap, pos2, ALIGN(pos2 + len, PAGE_SIZE),
+				      &daddr, NULL);
+	if (ret < 0)
+		return -EIO;
+
+	*same = !memcmp(saddr, daddr, len);
+	return len;
+}
+
+int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+		struct inode *dest, loff_t destoff, loff_t len, bool *is_same,
+		const struct iomap_ops *ops)
+{
+	int id, ret = 0;
+
+	id = dax_read_lock();
+	while (len) {
+		ret = iomap_apply2(src, srcoff, dest, destoff, len, 0, ops,
+				   is_same, dax_range_compare_actor);
+		if (ret < 0 || !*is_same)
+			goto out;
+
+		len -= ret;
+		srcoff += ret;
+		destoff += ret;
+	}
+	ret = 0;
+out:
+	dax_read_unlock(id);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(dax_dedupe_file_range_compare);
diff --git a/fs/remap_range.c b/fs/remap_range.c
index 77dba3a49e65..9079390edaf3 100644
--- a/fs/remap_range.c
+++ b/fs/remap_range.c
@@ -14,6 +14,7 @@
 #include <linux/compat.h>
 #include <linux/mount.h>
 #include <linux/fs.h>
+#include <linux/dax.h>
 #include "internal.h"
 
 #include <linux/uaccess.h>
@@ -199,9 +200,9 @@ static void vfs_unlock_two_pages(struct page *page1, struct page *page2)
  * Compare extents of two files to see if they are the same.
  * Caller must have locked both inodes to prevent write races.
  */
-static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
-					 struct inode *dest, loff_t destoff,
-					 loff_t len, bool *is_same)
+int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+				  struct inode *dest, loff_t destoff,
+				  loff_t len, bool *is_same)
 {
 	loff_t src_poff;
 	loff_t dest_poff;
@@ -280,6 +281,7 @@ static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
 out_error:
 	return error;
 }
+EXPORT_SYMBOL(vfs_dedupe_file_range_compare);
 
 /*
  * Check that the two inodes are eligible for cloning, the ranges make
@@ -289,9 +291,11 @@ static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
  * If there's an error, then the usual negative error code is returned.
  * Otherwise returns 0 with *len set to the request length.
  */
-int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
-				  struct file *file_out, loff_t pos_out,
-				  loff_t *len, unsigned int remap_flags)
+static int
+__generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				struct file *file_out, loff_t pos_out,
+				loff_t *len, unsigned int remap_flags,
+				const struct iomap_ops *ops)
 {
 	struct inode *inode_in = file_inode(file_in);
 	struct inode *inode_out = file_inode(file_out);
@@ -351,8 +355,15 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
 	if (remap_flags & REMAP_FILE_DEDUP) {
 		bool		is_same = false;
 
-		ret = vfs_dedupe_file_range_compare(inode_in, pos_in,
-				inode_out, pos_out, *len, &is_same);
+		if (!IS_DAX(inode_in) && !IS_DAX(inode_out))
+			ret = vfs_dedupe_file_range_compare(inode_in, pos_in,
+					inode_out, pos_out, *len, &is_same);
+		else if (IS_DAX(inode_in) && IS_DAX(inode_out) && ops)
+			ret = dax_dedupe_file_range_compare(inode_in, pos_in,
+					inode_out, pos_out, *len, &is_same,
+					ops);
+		else
+			return -EINVAL;
 		if (ret)
 			return ret;
 		if (!is_same)
@@ -370,6 +381,24 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
 
 	return ret;
 }
+
+int dax_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+			      struct file *file_out, loff_t pos_out,
+			      loff_t *len, unsigned int remap_flags,
+			      const struct iomap_ops *ops)
+{
+	return __generic_remap_file_range_prep(file_in, pos_in, file_out,
+					       pos_out, len, remap_flags, ops);
+}
+EXPORT_SYMBOL(dax_remap_file_range_prep);
+
+int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				  struct file *file_out, loff_t pos_out,
+				  loff_t *len, unsigned int remap_flags)
+{
+	return __generic_remap_file_range_prep(file_in, pos_in, file_out,
+					       pos_out, len, remap_flags, NULL);
+}
 EXPORT_SYMBOL(generic_remap_file_range_prep);
 
 loff_t do_clone_file_range(struct file *file_in, loff_t pos_in,
diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
index 6fa05fb78189..f5b3a3da36b7 100644
--- a/fs/xfs/xfs_reflink.c
+++ b/fs/xfs/xfs_reflink.c
@@ -1308,8 +1308,13 @@ xfs_reflink_remap_prep(
 	if (IS_DAX(inode_in) || IS_DAX(inode_out))
 		goto out_unlock;
 
-	ret = generic_remap_file_range_prep(file_in, pos_in, file_out, pos_out,
-			len, remap_flags);
+	if (IS_DAX(inode_in))
+		ret = generic_remap_file_range_prep(file_in, pos_in, file_out,
+						    pos_out, len, remap_flags);
+	else
+		ret = dax_remap_file_range_prep(file_in, pos_in, file_out,
+						pos_out, len, remap_flags,
+						&xfs_read_iomap_ops);
 	if (ret || *len == 0)
 		goto out_unlock;
 
diff --git a/include/linux/dax.h b/include/linux/dax.h
index 3275e01ed33d..32e1c34349f2 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -239,6 +239,10 @@ int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
 				      pgoff_t index);
 s64 dax_iomap_zero(loff_t pos, u64 length, struct iomap *iomap,
 		struct iomap *srcmap);
+int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+				  struct inode *dest, loff_t destoff,
+				  loff_t len, bool *is_same,
+				  const struct iomap_ops *ops);
 static inline bool dax_mapping(struct address_space *mapping)
 {
 	return mapping->host && IS_DAX(mapping->host);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index fd47deea7c17..2e6ec5bdf82a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -68,6 +68,7 @@ struct fsverity_info;
 struct fsverity_operations;
 struct fs_context;
 struct fs_parameter_spec;
+struct iomap_ops;
 
 extern void __init inode_init(void);
 extern void __init inode_init_early(void);
@@ -1910,13 +1911,19 @@ extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
 extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
 extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
 				   loff_t, size_t, unsigned int);
+typedef int (*compare_range_t)(struct inode *src, loff_t srcpos,
+			       struct inode *dest, loff_t destpos,
+			       loff_t len, bool *is_same);
 extern ssize_t generic_copy_file_range(struct file *file_in, loff_t pos_in,
 				       struct file *file_out, loff_t pos_out,
 				       size_t len, unsigned int flags);
-extern int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
-					 struct file *file_out, loff_t pos_out,
-					 loff_t *count,
-					 unsigned int remap_flags);
+int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				  struct file *file_out, loff_t pos_out,
+				  loff_t *count, unsigned int remap_flags);
+int dax_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+			      struct file *file_out, loff_t pos_out,
+			      loff_t *len, unsigned int remap_flags,
+			      const struct iomap_ops *ops);
 extern loff_t do_clone_file_range(struct file *file_in, loff_t pos_in,
 				  struct file *file_out, loff_t pos_out,
 				  loff_t len, unsigned int remap_flags);
-- 
2.30.1




WARNING: multiple messages have this Message-ID (diff)
From: Shiyang Ruan <ruansy.fnst@fujitsu.com>
To: <linux-kernel@vger.kernel.org>, <linux-xfs@vger.kernel.org>,
	<linux-nvdimm@lists.01.org>, <linux-fsdevel@vger.kernel.org>
Cc: jack@suse.cz, darrick.wong@oracle.com, david@fromorbit.com,
	ocfs2-devel@oss.oracle.com, viro@zeniv.linux.org.uk,
	Goldwyn Rodrigues <rgoldwyn@suse.com>,
	dan.j.williams@intel.com, linux-btrfs@vger.kernel.org
Subject: [Ocfs2-devel] [RESEND PATCH v2.1 08/10] fsdax: Dedup file range to use a compare function
Date: Thu, 4 Mar 2021 13:42:21 +0800	[thread overview]
Message-ID: <20210304054221.1148015-1-ruansy.fnst@fujitsu.com> (raw)
In-Reply-To: <20210226002030.653855-9-ruansy.fnst@fujitsu.com>

With dax we cannot deal with readpage() etc. So, we create a dax
comparison funciton which is similar with
vfs_dedupe_file_range_compare().
And introduce dax_remap_file_range_prep() for filesystem use.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: Shiyang Ruan <ruansy.fnst@fujitsu.com>
---
 fs/dax.c             | 56 ++++++++++++++++++++++++++++++++++++++++++++
 fs/remap_range.c     | 45 ++++++++++++++++++++++++++++-------
 fs/xfs/xfs_reflink.c |  9 +++++--
 include/linux/dax.h  |  4 ++++
 include/linux/fs.h   | 15 ++++++++----
 5 files changed, 115 insertions(+), 14 deletions(-)

diff --git a/fs/dax.c b/fs/dax.c
index 4f6c6ba68e6f..dbb95f00b38b 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1856,3 +1856,59 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf,
 	return dax_insert_pfn_mkwrite(vmf, pfn, order);
 }
 EXPORT_SYMBOL_GPL(dax_finish_sync_fault);
+
+static loff_t dax_range_compare_actor(struct inode *ino1, loff_t pos1,
+		struct inode *ino2, loff_t pos2, loff_t len, void *data,
+		struct iomap *smap, struct iomap *dmap)
+{
+	void *saddr, *daddr;
+	bool *same = data;
+	int ret;
+
+	if (smap->type == IOMAP_HOLE && dmap->type == IOMAP_HOLE) {
+		*same = true;
+		return len;
+	}
+
+	if (smap->type == IOMAP_HOLE || dmap->type == IOMAP_HOLE) {
+		*same = false;
+		return 0;
+	}
+
+	ret = dax_iomap_direct_access(smap, pos1, ALIGN(pos1 + len, PAGE_SIZE),
+				      &saddr, NULL);
+	if (ret < 0)
+		return -EIO;
+
+	ret = dax_iomap_direct_access(dmap, pos2, ALIGN(pos2 + len, PAGE_SIZE),
+				      &daddr, NULL);
+	if (ret < 0)
+		return -EIO;
+
+	*same = !memcmp(saddr, daddr, len);
+	return len;
+}
+
+int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+		struct inode *dest, loff_t destoff, loff_t len, bool *is_same,
+		const struct iomap_ops *ops)
+{
+	int id, ret = 0;
+
+	id = dax_read_lock();
+	while (len) {
+		ret = iomap_apply2(src, srcoff, dest, destoff, len, 0, ops,
+				   is_same, dax_range_compare_actor);
+		if (ret < 0 || !*is_same)
+			goto out;
+
+		len -= ret;
+		srcoff += ret;
+		destoff += ret;
+	}
+	ret = 0;
+out:
+	dax_read_unlock(id);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(dax_dedupe_file_range_compare);
diff --git a/fs/remap_range.c b/fs/remap_range.c
index 77dba3a49e65..9079390edaf3 100644
--- a/fs/remap_range.c
+++ b/fs/remap_range.c
@@ -14,6 +14,7 @@
 #include <linux/compat.h>
 #include <linux/mount.h>
 #include <linux/fs.h>
+#include <linux/dax.h>
 #include "internal.h"
 
 #include <linux/uaccess.h>
@@ -199,9 +200,9 @@ static void vfs_unlock_two_pages(struct page *page1, struct page *page2)
  * Compare extents of two files to see if they are the same.
  * Caller must have locked both inodes to prevent write races.
  */
-static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
-					 struct inode *dest, loff_t destoff,
-					 loff_t len, bool *is_same)
+int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+				  struct inode *dest, loff_t destoff,
+				  loff_t len, bool *is_same)
 {
 	loff_t src_poff;
 	loff_t dest_poff;
@@ -280,6 +281,7 @@ static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
 out_error:
 	return error;
 }
+EXPORT_SYMBOL(vfs_dedupe_file_range_compare);
 
 /*
  * Check that the two inodes are eligible for cloning, the ranges make
@@ -289,9 +291,11 @@ static int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
  * If there's an error, then the usual negative error code is returned.
  * Otherwise returns 0 with *len set to the request length.
  */
-int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
-				  struct file *file_out, loff_t pos_out,
-				  loff_t *len, unsigned int remap_flags)
+static int
+__generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				struct file *file_out, loff_t pos_out,
+				loff_t *len, unsigned int remap_flags,
+				const struct iomap_ops *ops)
 {
 	struct inode *inode_in = file_inode(file_in);
 	struct inode *inode_out = file_inode(file_out);
@@ -351,8 +355,15 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
 	if (remap_flags & REMAP_FILE_DEDUP) {
 		bool		is_same = false;
 
-		ret = vfs_dedupe_file_range_compare(inode_in, pos_in,
-				inode_out, pos_out, *len, &is_same);
+		if (!IS_DAX(inode_in) && !IS_DAX(inode_out))
+			ret = vfs_dedupe_file_range_compare(inode_in, pos_in,
+					inode_out, pos_out, *len, &is_same);
+		else if (IS_DAX(inode_in) && IS_DAX(inode_out) && ops)
+			ret = dax_dedupe_file_range_compare(inode_in, pos_in,
+					inode_out, pos_out, *len, &is_same,
+					ops);
+		else
+			return -EINVAL;
 		if (ret)
 			return ret;
 		if (!is_same)
@@ -370,6 +381,24 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
 
 	return ret;
 }
+
+int dax_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+			      struct file *file_out, loff_t pos_out,
+			      loff_t *len, unsigned int remap_flags,
+			      const struct iomap_ops *ops)
+{
+	return __generic_remap_file_range_prep(file_in, pos_in, file_out,
+					       pos_out, len, remap_flags, ops);
+}
+EXPORT_SYMBOL(dax_remap_file_range_prep);
+
+int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				  struct file *file_out, loff_t pos_out,
+				  loff_t *len, unsigned int remap_flags)
+{
+	return __generic_remap_file_range_prep(file_in, pos_in, file_out,
+					       pos_out, len, remap_flags, NULL);
+}
 EXPORT_SYMBOL(generic_remap_file_range_prep);
 
 loff_t do_clone_file_range(struct file *file_in, loff_t pos_in,
diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
index 6fa05fb78189..f5b3a3da36b7 100644
--- a/fs/xfs/xfs_reflink.c
+++ b/fs/xfs/xfs_reflink.c
@@ -1308,8 +1308,13 @@ xfs_reflink_remap_prep(
 	if (IS_DAX(inode_in) || IS_DAX(inode_out))
 		goto out_unlock;
 
-	ret = generic_remap_file_range_prep(file_in, pos_in, file_out, pos_out,
-			len, remap_flags);
+	if (IS_DAX(inode_in))
+		ret = generic_remap_file_range_prep(file_in, pos_in, file_out,
+						    pos_out, len, remap_flags);
+	else
+		ret = dax_remap_file_range_prep(file_in, pos_in, file_out,
+						pos_out, len, remap_flags,
+						&xfs_read_iomap_ops);
 	if (ret || *len == 0)
 		goto out_unlock;
 
diff --git a/include/linux/dax.h b/include/linux/dax.h
index 3275e01ed33d..32e1c34349f2 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -239,6 +239,10 @@ int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
 				      pgoff_t index);
 s64 dax_iomap_zero(loff_t pos, u64 length, struct iomap *iomap,
 		struct iomap *srcmap);
+int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,
+				  struct inode *dest, loff_t destoff,
+				  loff_t len, bool *is_same,
+				  const struct iomap_ops *ops);
 static inline bool dax_mapping(struct address_space *mapping)
 {
 	return mapping->host && IS_DAX(mapping->host);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index fd47deea7c17..2e6ec5bdf82a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -68,6 +68,7 @@ struct fsverity_info;
 struct fsverity_operations;
 struct fs_context;
 struct fs_parameter_spec;
+struct iomap_ops;
 
 extern void __init inode_init(void);
 extern void __init inode_init_early(void);
@@ -1910,13 +1911,19 @@ extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
 extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
 extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *,
 				   loff_t, size_t, unsigned int);
+typedef int (*compare_range_t)(struct inode *src, loff_t srcpos,
+			       struct inode *dest, loff_t destpos,
+			       loff_t len, bool *is_same);
 extern ssize_t generic_copy_file_range(struct file *file_in, loff_t pos_in,
 				       struct file *file_out, loff_t pos_out,
 				       size_t len, unsigned int flags);
-extern int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
-					 struct file *file_out, loff_t pos_out,
-					 loff_t *count,
-					 unsigned int remap_flags);
+int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+				  struct file *file_out, loff_t pos_out,
+				  loff_t *count, unsigned int remap_flags);
+int dax_remap_file_range_prep(struct file *file_in, loff_t pos_in,
+			      struct file *file_out, loff_t pos_out,
+			      loff_t *len, unsigned int remap_flags,
+			      const struct iomap_ops *ops);
 extern loff_t do_clone_file_range(struct file *file_in, loff_t pos_in,
 				  struct file *file_out, loff_t pos_out,
 				  loff_t len, unsigned int remap_flags);
-- 
2.30.1




_______________________________________________
Ocfs2-devel mailing list
Ocfs2-devel@oss.oracle.com
https://oss.oracle.com/mailman/listinfo/ocfs2-devel

  parent reply	other threads:[~2021-03-04  5:42 UTC|newest]

Thread overview: 220+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-26  0:20 [PATCH v2 00/10] fsdax,xfs: Add reflink&dedupe support for fsdax Shiyang Ruan
2021-02-26  0:20 ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Shiyang Ruan
2021-02-26  0:20 ` [PATCH v2 00/10] fsdax,xfs: " Shiyang Ruan
2021-02-26  0:20 ` [PATCH v2 01/10] fsdax: Factor helpers to simplify dax fault code Shiyang Ruan
2021-02-26  0:20   ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-03-03  9:13   ` Christoph Hellwig
2021-03-03  9:13     ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:13     ` Christoph Hellwig
2021-02-26  0:20 ` [PATCH v2 02/10] fsdax: Factor helper: dax_fault_actor() Shiyang Ruan
2021-02-26  0:20   ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-03-03  9:28   ` Christoph Hellwig
2021-03-03  9:28     ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:28     ` Christoph Hellwig
2021-03-12  9:01     ` ruansy.fnst
2021-03-12  9:01       ` [Ocfs2-devel] " ruansy.fnst
2021-03-12  9:01       ` ruansy.fnst
2021-02-26  0:20 ` [PATCH v2 03/10] fsdax: Output address in dax_iomap_pfn() and rename it Shiyang Ruan
2021-02-26  0:20   ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-02-26  0:20 ` [PATCH v2 04/10] fsdax: Introduce dax_iomap_cow_copy() Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-03-03  9:29   ` Christoph Hellwig
2021-03-03  9:29     ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:29     ` Christoph Hellwig
2021-02-26  0:20 ` [PATCH v2 05/10] fsdax: Replace mmap entry in case of CoW Shiyang Ruan
2021-02-26  0:20   ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-03-03  9:30   ` Christoph Hellwig
2021-03-03  9:30     ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:30     ` Christoph Hellwig
2021-03-03  9:41     ` ruansy.fnst
2021-03-03  9:41       ` [Ocfs2-devel] " ruansy.fnst
2021-03-03  9:41       ` ruansy.fnst
2021-03-03  9:44       ` Christoph Hellwig
2021-03-03  9:44         ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:44         ` Christoph Hellwig
2021-03-03  9:48   ` Christoph Hellwig
2021-03-03  9:48     ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:48     ` Christoph Hellwig
2021-02-26  0:20 ` [PATCH v2 06/10] fsdax: Add dax_iomap_cow_copy() for dax_iomap_zero Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-03-03  9:31   ` Christoph Hellwig
2021-03-03  9:31     ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:31     ` Christoph Hellwig
2021-02-26  0:20 ` [PATCH v2 07/10] iomap: Introduce iomap_apply2() for operations on two files Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-02-26  4:14   ` Darrick J. Wong
2021-02-26  4:14     ` [Ocfs2-devel] " Darrick J. Wong
2021-02-26  4:14     ` Darrick J. Wong
2021-02-26  8:11     ` ruansy.fnst
2021-02-26  8:11       ` [Ocfs2-devel] " ruansy.fnst
2021-02-26  8:11       ` ruansy.fnst
2021-02-26  8:25   ` Shiyang Ruan
2021-02-26  8:25     ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  8:25     ` Shiyang Ruan
2021-03-04  5:41   ` [RESEND PATCH v2.1 " Shiyang Ruan
2021-03-04  5:41     ` [Ocfs2-devel] " Shiyang Ruan
2021-03-04  5:41     ` Shiyang Ruan
2021-03-11 12:30     ` Christoph Hellwig
2021-03-11 12:30       ` [Ocfs2-devel] " Christoph Hellwig
2021-03-11 12:30       ` Christoph Hellwig
2021-02-26  0:20 ` [PATCH v2 08/10] fsdax: Dedup file range to use a compare function Shiyang Ruan
2021-02-26  0:20   ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-02-26  8:28   ` Shiyang Ruan
2021-02-26  8:28     ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  8:28     ` Shiyang Ruan
2021-03-03  8:20   ` Joe Perches
2021-03-03  8:20     ` [Ocfs2-devel] " Joe Perches
2021-03-03  8:20     ` Joe Perches
2021-03-03  8:45     ` ruansy.fnst
2021-03-03  8:45       ` [Ocfs2-devel] " ruansy.fnst
2021-03-03  9:04       ` Joe Perches
2021-03-03  9:04         ` [Ocfs2-devel] " Joe Perches
2021-03-03  9:39       ` hch
2021-03-03  9:39         ` [Ocfs2-devel] " hch
2021-03-03  9:46         ` ruansy.fnst
2021-03-03  9:46           ` [Ocfs2-devel] " ruansy.fnst
2021-03-04  5:42   ` Shiyang Ruan [this message]
2021-03-04  5:42     ` [Ocfs2-devel] [RESEND PATCH v2.1 " Shiyang Ruan
2021-03-04  5:42     ` Shiyang Ruan
2021-02-26  0:20 ` [PATCH v2 09/10] fs/xfs: Handle CoW for fsdax write() path Shiyang Ruan
2021-02-26  0:20   ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-03-03  9:43   ` Christoph Hellwig
2021-03-03  9:43     ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03  9:43     ` Christoph Hellwig
2021-03-03  9:57     ` ruansy.fnst
2021-03-03  9:57       ` [Ocfs2-devel] " ruansy.fnst
2021-03-03  9:57       ` ruansy.fnst
2021-03-03 10:43       ` Christoph Hellwig
2021-03-03 10:43         ` [Ocfs2-devel] " Christoph Hellwig
2021-03-03 10:43         ` Christoph Hellwig
2021-03-04  1:35         ` ruansy.fnst
2021-03-04  1:35           ` [Ocfs2-devel] " ruansy.fnst
2021-03-04  1:35           ` ruansy.fnst
2021-02-26  0:20 ` [PATCH v2 10/10] fs/xfs: Add dedupe support for fsdax Shiyang Ruan
2021-02-26  0:20   ` [Ocfs2-devel] " Shiyang Ruan
2021-02-26  0:20   ` Shiyang Ruan
2021-02-26  9:45 ` Question about the "EXPERIMENTAL" tag for dax in XFS ruansy.fnst
2021-02-26  9:45   ` [Ocfs2-devel] " ruansy.fnst
2021-02-26  9:45   ` ruansy.fnst
2021-02-26 19:04   ` Darrick J. Wong
2021-02-26 19:04     ` [Ocfs2-devel] " Darrick J. Wong
2021-02-26 19:04     ` Darrick J. Wong
2021-02-26 19:24     ` Dan Williams
2021-02-26 19:24       ` [Ocfs2-devel] " Dan Williams
2021-02-26 19:24       ` Dan Williams
2021-02-26 20:51       ` Dave Chinner
2021-02-26 20:51         ` [Ocfs2-devel] " Dave Chinner
2021-02-26 20:51         ` Dave Chinner
2021-02-26 20:59         ` Dan Williams
2021-02-26 20:59           ` [Ocfs2-devel] " Dan Williams
2021-02-26 20:59           ` Dan Williams
2021-02-26 21:27           ` Dave Chinner
2021-02-26 21:27             ` [Ocfs2-devel] " Dave Chinner
2021-02-26 21:27             ` Dave Chinner
2021-02-26 22:41             ` Dan Williams
2021-02-26 22:41               ` [Ocfs2-devel] " Dan Williams
2021-02-26 22:41               ` Dan Williams
2021-02-27 22:36               ` Dave Chinner
2021-02-27 22:36                 ` [Ocfs2-devel] " Dave Chinner
2021-02-27 22:36                 ` Dave Chinner
2021-02-27 23:40                 ` Dan Williams
2021-02-27 23:40                   ` [Ocfs2-devel] " Dan Williams
2021-02-27 23:40                   ` Dan Williams
2021-02-28 22:38                   ` Dave Chinner
2021-02-28 22:38                     ` [Ocfs2-devel] " Dave Chinner
2021-02-28 22:38                     ` Dave Chinner
2021-03-01 20:55                     ` Dan Williams
2021-03-01 20:55                       ` [Ocfs2-devel] " Dan Williams
2021-03-01 20:55                       ` Dan Williams
2021-03-01 22:46                       ` Dave Chinner
2021-03-01 22:46                         ` [Ocfs2-devel] " Dave Chinner
2021-03-01 22:46                         ` Dave Chinner
2021-03-02  0:32                         ` Dan Williams
2021-03-02  0:32                           ` [Ocfs2-devel] " Dan Williams
2021-03-02  0:32                           ` Dan Williams
2021-03-02  2:42                           ` Dave Chinner
2021-03-02  2:42                             ` [Ocfs2-devel] " Dave Chinner
2021-03-02  2:42                             ` Dave Chinner
2021-03-02  3:33                             ` Dan Williams
2021-03-02  3:33                               ` [Ocfs2-devel] " Dan Williams
2021-03-02  3:33                               ` Dan Williams
2021-03-02  5:38                               ` Dave Chinner
2021-03-02  5:38                                 ` [Ocfs2-devel] " Dave Chinner
2021-03-02  5:38                                 ` Dave Chinner
2021-03-02  5:50                                 ` Dan Williams
2021-03-02  5:50                                   ` [Ocfs2-devel] " Dan Williams
2021-03-02  5:50                                   ` Dan Williams
2021-03-02  3:28                       ` Darrick J. Wong
2021-03-02  3:28                         ` [Ocfs2-devel] " Darrick J. Wong
2021-03-02  3:28                         ` Darrick J. Wong
2021-03-02  5:41                         ` Dan Williams
2021-03-02  5:41                           ` [Ocfs2-devel] " Dan Williams
2021-03-02  5:41                           ` Dan Williams
2021-03-02  7:57                           ` Dave Chinner
2021-03-02  7:57                             ` [Ocfs2-devel] " Dave Chinner
2021-03-02  7:57                             ` Dave Chinner
2021-03-02 17:49                             ` Dan Williams
2021-03-02 17:49                               ` [Ocfs2-devel] " Dan Williams
2021-03-02 17:49                               ` Dan Williams
2021-03-04 23:40                               ` Darrick J. Wong
2021-03-04 23:40                                 ` [Ocfs2-devel] " Darrick J. Wong
2021-03-04 23:40                                 ` Darrick J. Wong
2021-03-01  7:26       ` Yasunori Goto
2021-03-01  7:26         ` [Ocfs2-devel] " Yasunori Goto
2021-03-01  7:26         ` Yasunori Goto
2021-03-01 21:34         ` Dan Williams
2021-03-01 21:34           ` [Ocfs2-devel] " Dan Williams
2021-03-01 21:34           ` Dan Williams
2021-03-09  6:36 ` [PATCH v2 00/10] fsdax,xfs: Add reflink&dedupe support for fsdax Xiaoguang Wang
2021-03-09  6:36   ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Xiaoguang Wang
2021-03-09  6:36   ` [PATCH v2 00/10] fsdax,xfs: " Xiaoguang Wang
2021-03-10  1:32   ` ruansy.fnst
2021-03-10  1:32     ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " ruansy.fnst
2021-03-09 16:19 ` [PATCH v2 00/10] fsdax,xfs: " Goldwyn Rodrigues
2021-03-09 16:19   ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Goldwyn Rodrigues
2021-03-09 16:19   ` [PATCH v2 00/10] fsdax,xfs: " Goldwyn Rodrigues
2021-03-10  1:26   ` ruansy.fnst
2021-03-10  1:26     ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " ruansy.fnst
2021-03-10  1:26     ` [PATCH v2 00/10] fsdax,xfs: " ruansy.fnst
2021-03-10 12:30 ` Neal Gompa
2021-03-10 12:30   ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Neal Gompa
2021-03-10 12:30   ` [PATCH v2 00/10] fsdax,xfs: " Neal Gompa
2021-03-10 13:02   ` Matthew Wilcox
2021-03-10 13:02     ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Matthew Wilcox
2021-03-10 13:02     ` [PATCH v2 00/10] fsdax,xfs: " Matthew Wilcox
2021-03-10 13:36     ` Neal Gompa
2021-03-10 13:36       ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Neal Gompa
2021-03-10 13:36       ` [PATCH v2 00/10] fsdax,xfs: " Neal Gompa
2021-03-10 13:55       ` Matthew Wilcox
2021-03-10 13:55         ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Matthew Wilcox
2021-03-10 13:55         ` [PATCH v2 00/10] fsdax,xfs: " Matthew Wilcox
2021-03-10 14:21     ` Goldwyn Rodrigues
2021-03-10 14:21       ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Goldwyn Rodrigues
2021-03-10 14:21       ` [PATCH v2 00/10] fsdax,xfs: " Goldwyn Rodrigues
2021-03-10 14:26       ` Matthew Wilcox
2021-03-10 14:26         ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Matthew Wilcox
2021-03-10 14:26         ` [PATCH v2 00/10] fsdax,xfs: " Matthew Wilcox
2021-03-10 17:04         ` Goldwyn Rodrigues
2021-03-10 17:04           ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Goldwyn Rodrigues
2021-03-10 17:04           ` [PATCH v2 00/10] fsdax,xfs: " Goldwyn Rodrigues
2021-03-11  0:53         ` Dan Williams
2021-03-11  0:53           ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Dan Williams
2021-03-11  0:53           ` [PATCH v2 00/10] fsdax,xfs: " Dan Williams
2021-03-11  8:26           ` Neal Gompa
2021-03-11  8:26             ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Neal Gompa
2021-03-11  8:26             ` [PATCH v2 00/10] fsdax,xfs: " Neal Gompa
2021-03-13 13:07         ` Adam Borowski
2021-03-13 13:07           ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Adam Borowski
2021-03-13 13:07           ` [PATCH v2 00/10] fsdax,xfs: " Adam Borowski
2021-03-13 16:24           ` Neal Gompa
2021-03-13 16:24             ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Neal Gompa
2021-03-13 16:24             ` [PATCH v2 00/10] fsdax,xfs: " Neal Gompa
2021-03-13 22:00             ` Adam Borowski
2021-03-13 22:00               ` [Ocfs2-devel] [PATCH v2 00/10] fsdax, xfs: " Adam Borowski
2021-03-13 22:00               ` [PATCH v2 00/10] fsdax,xfs: " Adam Borowski

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=20210304054221.1148015-1-ruansy.fnst@fujitsu.com \
    --to=ruansy.fnst@fujitsu.com \
    --cc=darrick.wong@oracle.com \
    --cc=david@fromorbit.com \
    --cc=hch@lst.de \
    --cc=jack@suse.cz \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvdimm@lists.01.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=ocfs2-devel@oss.oracle.com \
    --cc=rgoldwyn@suse.com \
    --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.