From: Mike C. <mi...@us...> - 2005-03-18 21:48:01
|
I think I may have been smoking crack when I debugged this. The fix is no good - although removing the times_out handler is probably good in the long run. Mike Christie wrote: > This is to fix the irq problem someone reported. Basically we are > running from a soft irq but when we return EH_HANDLED we hit the code in > __scsi_done which does not like that we are running from one. > > This code is actually not buying us anything. In some cases we do not > have to fire the eh. the eh detects the same situation so it does not > end up sending TMFs so it saves the eh thread from having to run and the > host/target from being quiesced. In the end the host block/unblock code > would catch the case where this is useful best, but I do not think > anyone wants to port that stuff around. > > Did not fix the locking comments as they apply to the rpelacement > timeout code still. This patch is for the stable distro release btw. In > the other version I will fix the locks since it will use the > block/unblock code when that patch is updated. I am still trying to see > how to use the block and unblock code in open-iscsi to fix some problems > though. > > > ------------------------------------------------------------------------ > > --- linux-iscsi/driver/iscsi-initiator.c 2005-03-14 22:33:41.000000000 -0800 > +++ linux-iscsi.work/driver/iscsi-initiator.c 2005-03-15 14:27:45.000000000 -0800 > @@ -134,55 +134,6 @@ iscsi_slave_configure(struct scsi_device > return 0; > } > > -/** > - * iscsi_eh_timed_out - handle scsi command timeouts > - * sc: scsi command > - * > - * Note: > - * In the normal case where the session is ok or the command was queued > - * when the session was down (and it never came up but did not yet timeout > - * - TODO use device block/unblock), we will fail the command here if > - * we can. For all other race cases where for example the session changed > - * state at the same time the command timed out but we had the task lock > - * we just ask for more time since those events will clean themselves up. > - **/ > -static enum scsi_eh_timer_return > -iscsi_eh_timed_out(struct scsi_cmnd *sc) > -{ > - struct Scsi_Host *shost = sc->device->host; > - struct iscsi_session *session = (struct iscsi_session *)shost->hostdata; > - struct iscsi_task *task; > - enum scsi_eh_timer_return ret = EH_RESET_TIMER; > - int result = DID_BUS_BUSY << 16; > - > - spin_lock(&session->task_lock); > - > - task = (struct iscsi_task *)sc->SCp.ptr; > - if (!task) { > - /* > - * completed while timer was firing > - */ > - ret = EH_HANDLED; > - goto done; > - } > - > - if (test_bit(SESSION_ESTABLISHED, &session->control_bits)) > - ret = EH_NOT_HANDLED; > - else if (test_bit(SESSION_REPLACEMENT_TIMEDOUT, &session->control_bits)) > - result = DID_NO_CONNECT << 16; > - > - if (task->itt == ISCSI_RSVD_TASK_TAG) { > - sc->result = result; > - __iscsi_complete_task(task); > - ret = EH_HANDLED; > - } > - > - done: > - spin_unlock(&session->task_lock); > - > - return ret; > -} > - > static int > iscsi_eh_abort(struct scsi_cmnd *sc) > { > @@ -451,7 +402,6 @@ static struct scsi_host_template iscsi_d > .proc_name = ISCSI_PROC_NAME, > .module = THIS_MODULE, > .queuecommand = iscsi_queuecommand, > - .eh_timed_out = iscsi_eh_timed_out, > .eh_abort_handler = iscsi_eh_abort, > .eh_device_reset_handler = iscsi_eh_device_reset, > .eh_host_reset_handler = iscsi_eh_host_reset, |