isci: fix remote_device start_io regressions
authorDan Williams <dan.j.williams@intel.com>
Sun, 1 May 2011 17:13:04 +0000 (10:13 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 3 Jul 2011 11:00:39 +0000 (04:00 -0700)
While reducing indentation commits 7ab92c9e "isci: make a
remote_node_context a proper member of a remote_device", 0879e6a6 "isci:
merge remote_device substates into a single state machine" broke
handling of situations where i/o's successfully started at the port
level need to terminated when the remote_node declines to start the i/o.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/scsi/isci/remote_device.c

index 834a3feaca6310bc0a3726c4bac4f594e544e77f..3e567bf84c7455ed7e2cd6bd6516ba9dec2d5d6e 100644 (file)
@@ -1157,10 +1157,8 @@ static enum sci_status scic_sds_stp_remote_device_ready_ncq_substate_start_io_ha
                        return status;
 
                status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, request);
-               if (status != SCI_SUCCESS)
-                       return status;
-
-               status = request->state_handlers->start_handler(request);
+               if (status == SCI_SUCCESS)
+                       status = request->state_handlers->start_handler(request);
 
                scic_sds_remote_device_start_request(sci_dev, request, status);
        } else
@@ -1302,16 +1300,17 @@ static enum sci_status scic_sds_smp_remote_device_ready_idle_substate_start_io_h
 
        status = scic_sds_remote_node_context_start_io(&sci_dev->rnc, sci_req);
        if (status != SCI_SUCCESS)
-               return status;
+               goto out;
 
        status = scic_sds_request_start(sci_req);
        if (status != SCI_SUCCESS)
-               return status;
+               goto out;
 
        sci_dev->working_request = sci_req;
        sci_base_state_machine_change_state(&sci_dev->state_machine,
                                            SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_CMD);
 
+ out:
        scic_sds_remote_device_start_request(sci_dev, sci_req, status);
 
        return status;