[PATCH] nvme_fc: correct io timeout behavior
Christoph Hellwig
hch at infradead.org
Sun Oct 1 01:47:00 PDT 2017
> --- a/drivers/nvme/host/fc.c
> +++ b/drivers/nvme/host/fc.c
> @@ -1374,7 +1374,7 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
> sizeof(op->rsp_iu), DMA_FROM_DEVICE);
>
> if (atomic_read(&op->state) == FCPOP_STATE_ABORTED)
> - status = cpu_to_le16((NVME_SC_ABORT_REQ | NVME_SC_DNR) << 1);
> + status = cpu_to_le16(NVME_SC_ABORT_REQ << 1);
So the DNR bit goes away, ok.
> @@ -1445,15 +1445,22 @@ nvme_fc_fcpio_done(struct nvmefc_fcp_req *req)
> goto check_error;
> }
>
> + if (unlikely(!status && op->flags & FCOP_FLAGS_TERMIO))
> + status = cpu_to_le16(NVME_SC_ABORT_REQ << 1);
We grow another aborted case. And btw, we really should not use
NVME_SC_ABORT_REQ here because the command never reched the controller
to actually get a nvme abort. We might have to live with this for
now, but can you please review might addition of new status codes
for these host-internal cases in the latest ANA draft?
> + /*
> + * Force failures of commands if we're killing the controller
> + * or have an error on a command used to create an new association
> + */
> + if (status && (blk_queue_dying(rq->q) ||
> + ctrl->ctrl.state == NVME_CTRL_NEW ||
> + ctrl->ctrl.state == NVME_CTRL_RECONNECTING))
> + status |= cpu_to_le16(NVME_SC_DNR << 1);
And here we add back the dnr bit based on a few conditions.
As a nitpick I think the way the conditionals are nested isn't very
readable, can we split the first line up, please?
if (status &&
(blk_queue_dying(rq->q) ||
ctrl->ctrl.state == NVME_CTRL_NEW ||
ctrl->ctrl.state == NVME_CTRL_RECONNECTING))
status |= cpu_to_le16(NVME_SC_DNR << 1);
> complete_rq = __nvme_fc_fcpop_chk_teardowns(ctrl, op);
> + if (!complete_rq)
> nvme_end_request(rq, status, result);
> + else
> __nvme_fc_final_op_cleanup(rq);
avoid the unneeded invert and local variable:
if (unlikely(__nvme_fc_fcpop_chk_teardowns(ctrl, op)))
__nvme_fc_final_op_cleanup(rq);
else
nvme_end_request(rq, status, result);
and while we're at it: the AEN special case above assigns complete_rq,
but that value will never be read, so the complete_rq can be removed
entirely.
Can you split the reset handler bits into a separate patch with
a separate explanation?
More information about the Linux-nvme
mailing list