nvdimm_flush() maps provider flush failures to -EIO. Keep that default
because provider callbacks can report host-side or backend failures that
should remain generic I/O errors to the guest.

Guest-side allocation failures should not be reported as I/O errors. In the
virtio-pmem path, the flush request allocation can fail with -ENOMEM before
any request is submitted to the host. Mapping that to -EIO makes resource
pressure look like media failure.

Preserve -ENOMEM from provider callbacks and continue to map other non-zero
provider failures to -EIO. The generic flush path still returns 0, and
pmem_submit_bio() already converts errno values to block status for bio
completion.

Suggested-by: Pankaj Gupta <[email protected]>
Signed-off-by: Li Chen <[email protected]>
---
Changes in v7:
- Preserve only -ENOMEM and keep other provider/backend failures mapped to
  -EIO, per Pankaj's feedback.
v3->v4:
- New patch.

 drivers/nvdimm/region_devs.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c
index e35c2e18518f0..7cd2c2f0d3121 100644
--- a/drivers/nvdimm/region_devs.c
+++ b/drivers/nvdimm/region_devs.c
@@ -1115,7 +1115,8 @@ int nvdimm_flush(struct nd_region *nd_region, struct bio 
*bio)
        if (!nd_region->flush)
                rc = generic_nvdimm_flush(nd_region);
        else {
-               if (nd_region->flush(nd_region, bio))
+               rc = nd_region->flush(nd_region, bio);
+               if (rc && rc != -ENOMEM)
                        rc = -EIO;
        }
 
-- 
2.52.0

Reply via email to