[PATCH 2/3] dax: introduce dax clear poison to page aligned dax pwrite operation

From: Jane Chu
Date: Tue Sep 14 2021 - 19:32:31 EST


Currenty, when pwrite(2) s issued to a dax range that contains poison,
the pwrite(2) fails with EIO. Well, if the hardware backend of the
dax device is capable of clearing poison, try that and resume the write.

Signed-off-by: Jane Chu <jane.chu@xxxxxxxxxx>
---
fs/dax.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/fs/dax.c b/fs/dax.c
index 99b4e78d888f..592a156abbf2 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1156,8 +1156,17 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
if (ret)
break;

+ /*
+ * If WRITE operation encounters media error in a page aligned
+ * range, try to clear the error, then resume, for just once.
+ */
map_len = dax_direct_access(dax_dev, pgoff, PHYS_PFN(size),
&kaddr, NULL);
+ if ((map_len == -EIO) && (iov_iter_rw(iter) == WRITE)) {
+ if (dax_clear_poison(dax_dev, pgoff, PHYS_PFN(size)) == 0)
+ map_len = dax_direct_access(dax_dev, pgoff,
+ PHYS_PFN(size), &kaddr, NULL);
+ }
if (map_len < 0) {
ret = map_len;
break;
--
2.18.4