Re: [PATCH 2/3] dax: introduce dax_clear_poison to dax pwrite operation

2021-11-04 Thread Christoph Hellwig
On Tue, Sep 14, 2021 at 05:31:30PM -0600, Jane Chu wrote:
> + if ((map_len == -EIO) && (iov_iter_rw(iter) == WRITE)) {

No need for the inner braces.

> + if (dax_clear_poison(dax_dev, pgoff, PHYS_PFN(size)) == 
> 0)

Overly long line.

Otherwise looks good, but it might need a rebase to the iomap_iter
changes.




[PATCH 2/3] dax: introduce dax_clear_poison to dax pwrite operation

2021-09-14 Thread Jane Chu
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 
---
 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),
, 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), , NULL);
+   }
if (map_len < 0) {
ret = map_len;
break;
-- 
2.18.4