Since cqe->res is expected to be a negative value of errno, it's been
flipped to a positive value before passing it to io_u.c. However, in
case of io_uring_cmd with cmd_type=nvme, cqe->res might represent a NVMe
completion status type and code along with control fields such as DNR
since nvme_uring_cmd_end_io() in the NVMe driver sets the completion
status value and passes it up to io_uring.
For example, If a DULBE(Deallocated or Unwritten Logical Block Error)
is coming up from the device, cqe->res here would be 0x4287 which is a
DULBE error code of media error type.
This patch unified the error code to a positive value regardless of the
error type.
Signed-off-by: Minwoo Im <minwoo.im@samsung.com>
io_u = (struct io_u *) (uintptr_t) cqe->user_data;
if (cqe->res != 0) {
- io_u->error = -cqe->res;
+ io_u->error = abs(cqe->res);
return io_u;
} else {
io_u->error = 0;