nvme/nda: Fail all nvme I/Os after controller fails
Once the controller has failed, fail all I/O w/o sending it to the device. The reset of the nvme driver won't schedule any I/O to the failed device, and the controller is in an indeterminate state and can't accept I/O. Fail both at the top end of the sim and the bottom end. Don't bother queueing up the I/O for failure in a different task. Reviewed by: chuck Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D31341
This commit is contained in:
parent
e05d9788b7
commit
4b977e6dda
@ -1078,12 +1078,10 @@ _nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req)
|
|||||||
|
|
||||||
if (qpair->ctrlr->is_failed) {
|
if (qpair->ctrlr->is_failed) {
|
||||||
/*
|
/*
|
||||||
* The controller has failed. Post the request to a
|
* The controller has failed, so fail the request.
|
||||||
* task where it will be aborted, so that we do not
|
|
||||||
* invoke the request's callback in the context
|
|
||||||
* of the submission.
|
|
||||||
*/
|
*/
|
||||||
nvme_ctrlr_post_failed_request(qpair->ctrlr, req);
|
nvme_qpair_manual_complete_request(qpair, req,
|
||||||
|
NVME_SCT_GENERIC, NVME_SC_ABORTED_BY_REQUEST);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Put the request on the qpair's request queue to be
|
* Put the request on the qpair's request queue to be
|
||||||
|
@ -258,6 +258,10 @@ nvme_sim_action(struct cam_sim *sim, union ccb *ccb)
|
|||||||
break;
|
break;
|
||||||
case XPT_NVME_IO: /* Execute the requested I/O operation */
|
case XPT_NVME_IO: /* Execute the requested I/O operation */
|
||||||
case XPT_NVME_ADMIN: /* or Admin operation */
|
case XPT_NVME_ADMIN: /* or Admin operation */
|
||||||
|
if (ctrlr->is_failed) {
|
||||||
|
ccb->ccb_h.status = CAM_DEV_NOT_THERE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
nvme_sim_nvmeio(sim, ccb);
|
nvme_sim_nvmeio(sim, ccb);
|
||||||
return; /* no done */
|
return; /* no done */
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user