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) {
|
||||
/*
|
||||
* The controller has failed. Post the request to a
|
||||
* task where it will be aborted, so that we do not
|
||||
* invoke the request's callback in the context
|
||||
* of the submission.
|
||||
* The controller has failed, so fail the request.
|
||||
*/
|
||||
nvme_ctrlr_post_failed_request(qpair->ctrlr, req);
|
||||
nvme_qpair_manual_complete_request(qpair, req,
|
||||
NVME_SCT_GENERIC, NVME_SC_ABORTED_BY_REQUEST);
|
||||
} else {
|
||||
/*
|
||||
* 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;
|
||||
case XPT_NVME_IO: /* Execute the requested I/O 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);
|
||||
return; /* no done */
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user