Rudimentary and basic support for returning NVMe errors. Signed-off-by: Tony Asleson <tasle...@redhat.com> --- hw/block/nvme.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 12d8254250..faf72c2b8c 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -25,6 +25,7 @@ * offset 0 in BAR2 and supports only WDS, RDS and SQS for now. */ +#include "block/error_inject.h" #include "qemu/osdep.h" #include "qemu/units.h" #include "hw/block/block.h" @@ -390,6 +391,13 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd, return NVME_LBA_RANGE | NVME_DNR; } + if (!is_write) { + uint64_t error_sector = 0; + if (error_in_read(n->serial, slba, nlb, &error_sector)) { + return NVME_UNRECOVERED_READ | NVME_DNR; + } + } + if (nvme_map_prp(&req->qsg, &req->iov, prp1, prp2, data_size, n)) { block_acct_invalid(blk_get_stats(n->conf.blk), acct); return NVME_INVALID_FIELD | NVME_DNR; -- 2.21.0