From: "Darrick J. Wong" <djwong@kernel.org>
To: djwong@kernel.org, jane.chu@oracle.com
Cc: linux-xfs@vger.kernel.org, hch@infradead.org,
dan.j.williams@intel.com, linux-fsdevel@vger.kernel.org
Subject: [PATCH 4/5] xfs: implement FALLOC_FL_ZEROINIT_RANGE
Date: Fri, 17 Sep 2021 18:31:06 -0700 [thread overview]
Message-ID: <163192866672.417973.1497612280233084622.stgit@magnolia> (raw)
In-Reply-To: <163192864476.417973.143014658064006895.stgit@magnolia>
From: Darrick J. Wong <djwong@kernel.org>
Implement this new fallocate mode so that persistent memory users can,
upon receipt of a pmem poison notification, cause the pmem to be
reinitialized to a known value (zero) and clear any hardware poison
state that might be lurking.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
fs/xfs/xfs_bmap_util.c | 22 ++++++++++++++++++++++
fs/xfs/xfs_bmap_util.h | 2 ++
fs/xfs/xfs_file.c | 11 ++++++++---
fs/xfs/xfs_trace.h | 1 +
4 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
index 73a36b7be3bd..319e79bb7fd8 100644
--- a/fs/xfs/xfs_bmap_util.c
+++ b/fs/xfs/xfs_bmap_util.c
@@ -956,6 +956,28 @@ xfs_flush_unmap_range(
return 0;
}
+int
+xfs_file_zeroinit_space(
+ struct xfs_inode *ip,
+ xfs_off_t offset,
+ xfs_off_t len)
+{
+ struct inode *inode = VFS_I(ip);
+ int error;
+
+ trace_xfs_zeroinit_file_space(ip, offset, len);
+
+ if (IS_DAX(inode))
+ error = dax_zeroinit_range(inode, offset, len,
+ &xfs_read_iomap_ops);
+ else
+ error = iomap_zeroout_range(inode, offset, len,
+ &xfs_read_iomap_ops);
+ if (error == -ECANCELED)
+ return -EOPNOTSUPP;
+ return error;
+}
+
int
xfs_free_file_space(
struct xfs_inode *ip,
diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h
index 9f993168b55b..7bb425d0876c 100644
--- a/fs/xfs/xfs_bmap_util.h
+++ b/fs/xfs/xfs_bmap_util.h
@@ -61,6 +61,8 @@ int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset,
xfs_off_t len);
int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset,
xfs_off_t len);
+int xfs_file_zeroinit_space(struct xfs_inode *ip, xfs_off_t offset,
+ xfs_off_t length);
/* EOF block manipulation functions */
bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force);
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 7aa943edfc02..886e819efa3b 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -899,7 +899,8 @@ xfs_break_layouts(
#define XFS_FALLOC_FL_SUPPORTED \
(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \
FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \
- FALLOC_FL_INSERT_RANGE | FALLOC_FL_UNSHARE_RANGE)
+ FALLOC_FL_INSERT_RANGE | FALLOC_FL_UNSHARE_RANGE | \
+ FALLOC_FL_ZEROINIT_RANGE)
STATIC long
xfs_file_fallocate(
@@ -950,13 +951,17 @@ xfs_file_fallocate(
* handled at the right time by xfs_prepare_shift().
*/
if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_ZERO_RANGE |
- FALLOC_FL_COLLAPSE_RANGE)) {
+ FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZEROINIT_RANGE)) {
error = xfs_flush_unmap_range(ip, offset, len);
if (error)
goto out_unlock;
}
- if (mode & FALLOC_FL_PUNCH_HOLE) {
+ if (mode & FALLOC_FL_ZEROINIT_RANGE) {
+ error = xfs_file_zeroinit_space(ip, offset, len);
+ if (error)
+ goto out_unlock;
+ } else if (mode & FALLOC_FL_PUNCH_HOLE) {
error = xfs_free_file_space(ip, offset, len);
if (error)
goto out_unlock;
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
index 4a8076ef8cb4..eccad0a5c40f 100644
--- a/fs/xfs/xfs_trace.h
+++ b/fs/xfs/xfs_trace.h
@@ -1534,6 +1534,7 @@ DEFINE_SIMPLE_IO_EVENT(xfs_zero_eof);
DEFINE_SIMPLE_IO_EVENT(xfs_end_io_direct_write);
DEFINE_SIMPLE_IO_EVENT(xfs_end_io_direct_write_unwritten);
DEFINE_SIMPLE_IO_EVENT(xfs_end_io_direct_write_append);
+DEFINE_SIMPLE_IO_EVENT(xfs_zeroinit_file_space);
DECLARE_EVENT_CLASS(xfs_itrunc_class,
TP_PROTO(struct xfs_inode *ip, xfs_fsize_t new_size),
next prev parent reply other threads:[~2021-09-18 1:31 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-18 1:30 [PATCHSET RFC v2 jane 0/5] vfs: enable userspace to reset damaged file storage Darrick J. Wong
2021-09-18 1:30 ` [PATCH 1/5] dax: prepare pmem for use by zero-initializing contents and clearing poisons Darrick J. Wong
2021-09-18 16:54 ` riteshh
2021-09-20 17:22 ` Darrick J. Wong
2021-09-21 4:07 ` riteshh
2021-09-22 18:26 ` Darrick J. Wong
2021-09-22 19:47 ` riteshh
2021-09-22 20:26 ` Dan Williams
2021-09-21 8:34 ` Christoph Hellwig
2021-09-22 18:10 ` Darrick J. Wong
2021-09-18 1:30 ` [PATCH 2/5] iomap: use accelerated zeroing on a block device to zero a file range Darrick J. Wong
2021-09-18 16:55 ` riteshh
2021-09-21 8:29 ` Christoph Hellwig
2021-09-22 18:53 ` Darrick J. Wong
2021-09-21 22:33 ` Dave Chinner
2021-09-22 18:54 ` Darrick J. Wong
2021-09-18 1:31 ` [PATCH 3/5] vfs: add a zero-initialization mode to fallocate Darrick J. Wong
2021-09-18 16:58 ` riteshh
2021-09-20 17:52 ` Eric Biggers
2021-09-20 18:06 ` Darrick J. Wong
2021-09-21 0:44 ` Dave Chinner
2021-09-21 8:31 ` Christoph Hellwig
2021-09-22 2:16 ` Dan Williams
2021-09-22 2:38 ` Darrick J. Wong
2021-09-22 3:59 ` Dave Chinner
2021-09-22 4:13 ` Darrick J. Wong
2021-09-22 5:49 ` Dave Chinner
2021-09-22 21:27 ` Darrick J. Wong
2021-09-23 0:02 ` Darrick J. Wong
2021-09-23 0:44 ` Darrick J. Wong
2021-09-23 1:42 ` Dave Chinner
2021-09-23 2:43 ` Dan Williams
2021-09-23 5:42 ` Dan Williams
2021-09-23 22:54 ` Dave Chinner
2021-09-24 1:18 ` Dan Williams
2021-09-24 1:21 ` Jane Chu
2021-09-24 1:35 ` Darrick J. Wong
2021-09-27 21:07 ` Dave Chinner
2021-09-27 21:57 ` Jane Chu
2021-09-28 0:08 ` Dan Williams
2021-09-22 5:28 ` riteshh
2021-09-18 1:31 ` Darrick J. Wong [this message]
2021-09-18 1:31 ` [PATCH 5/5] ext4: implement FALLOC_FL_ZEROINIT_RANGE Darrick J. Wong
2021-09-18 17:07 ` riteshh
2021-09-20 18:11 ` Darrick J. Wong
2021-09-21 6:10 ` riteshh
2021-09-18 18:05 ` [PATCHSET RFC v2 jane 0/5] vfs: enable userspace to reset damaged file storage Dan Williams
2021-09-23 0:51 ` Darrick J. Wong
2021-09-23 1:17 ` Dan Williams
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=163192866672.417973.1497612280233084622.stgit@magnolia \
--to=djwong@kernel.org \
--cc=dan.j.williams@intel.com \
--cc=hch@infradead.org \
--cc=jane.chu@oracle.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.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 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).