From: John Groves <[email protected]>

Convert the WARN_ON to a fatal error when pgmap_phys > phys. This
condition means the remapped region starts after the device's data
region, which is an impossible state. Previously the probe continued
with data_offset=0, leaving virt_addr silently misaligned. Now probe
returns -EINVAL with a diagnostic message.

Fixes: 759455848df0b ("dax: Save the kva from memremap")

Reviewed-by: Alison Schofield <[email protected]>
Signed-off-by: John Groves <[email protected]>
---
 drivers/dax/fsdev.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/dax/fsdev.c b/drivers/dax/fsdev.c
index af9ef80c05c6d..dcb512625ce65 100644
--- a/drivers/dax/fsdev.c
+++ b/drivers/dax/fsdev.c
@@ -320,8 +320,12 @@ static int fsdev_dax_probe(struct dev_dax *dev_dax)
                u64 phys = dev_dax->ranges[0].range.start;
                u64 pgmap_phys = pgmap[0].range.start;
 
-               if (!WARN_ON(pgmap_phys > phys))
-                       data_offset = phys - pgmap_phys;
+               if (pgmap_phys > phys) {
+                       dev_err(dev, "pgmap start %#llx exceeds data start 
%#llx\n",
+                               pgmap_phys, phys);
+                       return -EINVAL;
+               }
+               data_offset = phys - pgmap_phys;
 
                pr_debug("%s: offset detected phys=%llx pgmap_phys=%llx 
offset=%llx\n",
                       __func__, phys, pgmap_phys, data_offset);
-- 
2.53.0


Reply via email to