Commit 1db1f3ce authored by Vishal Verma's avatar Vishal Verma Committed by Dan Williams

libnvdimm, btt: fix a missed NVDIMM_IO_ATOMIC case in the write path

The IO context conversion for rw_bytes missed a case in the BTT write
path (btt_map_write) which should've been marked as atomic.

In reality this should not cause a problem, because map writes are to
small for nsio_rw_bytes to attempt error clearing, but it should be
fixed for posterity.

Add a might_sleep() in the non-atomic section of nsio_rw_bytes so that
things like the nfit unit tests, which don't actually sleep, can catch
bugs like this.

Cc: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarVishal Verma <vishal.l.verma@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent a15797f4
...@@ -1156,7 +1156,8 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip, ...@@ -1156,7 +1156,8 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip,
if (ret) if (ret)
goto out_map; goto out_map;
ret = btt_map_write(arena, premap, new_postmap, 0, 0, 0); ret = btt_map_write(arena, premap, new_postmap, 0, 0,
NVDIMM_IO_ATOMIC);
if (ret) if (ret)
goto out_map; goto out_map;
......
...@@ -292,6 +292,7 @@ static int nsio_rw_bytes(struct nd_namespace_common *ndns, ...@@ -292,6 +292,7 @@ static int nsio_rw_bytes(struct nd_namespace_common *ndns,
&& !(flags & NVDIMM_IO_ATOMIC)) { && !(flags & NVDIMM_IO_ATOMIC)) {
long cleared; long cleared;
might_sleep();
cleared = nvdimm_clear_poison(&ndns->dev, cleared = nvdimm_clear_poison(&ndns->dev,
nsio->res.start + offset, size); nsio->res.start + offset, size);
if (cleared < size) if (cleared < size)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment