When pwrite(2) encounters poison in a dax range, it fails with EIO.
But if the backend hardware of the dax device is capable of clearing
poison, try that and resume the write.

Signed-off-by: Jane Chu <jane....@oracle.com>
---
 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


Reply via email to