Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/sys/dev/nvme/nvme_ctrlr.c 248766 2013-03-26 21:48:41Z jimharris $");
---
> __FBSDID("$FreeBSD: head/sys/dev/nvme/nvme_ctrlr.c 248767 2013-03-26 21:58:38Z jimharris $");
313a314,352
> static void
> nvme_ctrlr_fail(struct nvme_controller *ctrlr)
> {
> int i;
>
> ctrlr->is_failed = TRUE;
> nvme_qpair_fail(&ctrlr->adminq);
> for (i = 0; i < ctrlr->num_io_queues; i++)
> nvme_qpair_fail(&ctrlr->ioq[i]);
> nvme_notify_fail_consumers(ctrlr);
> }
>
> void
> nvme_ctrlr_post_failed_request(struct nvme_controller *ctrlr,
> struct nvme_request *req)
> {
>
> mtx_lock(&ctrlr->fail_req_lock);
> STAILQ_INSERT_TAIL(&ctrlr->fail_req, req, stailq);
> mtx_unlock(&ctrlr->fail_req_lock);
> taskqueue_enqueue(ctrlr->taskqueue, &ctrlr->fail_req_task);
> }
>
> static void
> nvme_ctrlr_fail_req_task(void *arg, int pending)
> {
> struct nvme_controller *ctrlr = arg;
> struct nvme_request *req;
>
> mtx_lock(&ctrlr->fail_req_lock);
> while (!STAILQ_EMPTY(&ctrlr->fail_req)) {
> req = STAILQ_FIRST(&ctrlr->fail_req);
> STAILQ_REMOVE_HEAD(&ctrlr->fail_req, stailq);
> nvme_qpair_manual_complete_request(req->qpair, req,
> NVME_SCT_GENERIC, NVME_SC_ABORTED_BY_REQUEST, TRUE);
> }
> mtx_unlock(&ctrlr->fail_req_lock);
> }
>
429,430c468,473
< if (cmpset == 0)
< /* Controller is already resetting. */
---
> if (cmpset == 0 || ctrlr->is_failed)
> /*
> * Controller is already resetting or has failed. Return
> * immediately since there is no need to kick off another
> * reset in these cases.
> */
748c791,792
< if (nvme_ctrlr_identify(ctrlr) != 0)
---
> if (nvme_ctrlr_identify(ctrlr) != 0) {
> nvme_ctrlr_fail(ctrlr);
749a794
> }
751c796,797
< if (nvme_ctrlr_set_num_qpairs(ctrlr) != 0)
---
> if (nvme_ctrlr_set_num_qpairs(ctrlr) != 0) {
> nvme_ctrlr_fail(ctrlr);
752a799
> }
754c801,802
< if (nvme_ctrlr_create_qpairs(ctrlr) != 0)
---
> if (nvme_ctrlr_create_qpairs(ctrlr) != 0) {
> nvme_ctrlr_fail(ctrlr);
755a804
> }
757c806,807
< if (nvme_ctrlr_construct_namespaces(ctrlr) != 0)
---
> if (nvme_ctrlr_construct_namespaces(ctrlr) != 0) {
> nvme_ctrlr_fail(ctrlr);
758a809
> }
804a856,857
> else
> nvme_ctrlr_fail(ctrlr);
1001d1053
< TASK_INIT(&ctrlr->reset_task, 0, nvme_ctrlr_reset_task, ctrlr);
1006a1059
> TASK_INIT(&ctrlr->reset_task, 0, nvme_ctrlr_reset_task, ctrlr);
1007a1061,1066
> TASK_INIT(&ctrlr->fail_req_task, 0, nvme_ctrlr_fail_req_task, ctrlr);
> mtx_init(&ctrlr->fail_req_lock, "nvme ctrlr fail req lock", NULL,
> MTX_DEF);
> STAILQ_INIT(&ctrlr->fail_req);
> ctrlr->is_failed = FALSE;
>