On Fri, 2018-03-16 at 15:49 -0700, James Bottomley wrote:
> In your new code you have
> 
> +       if (sdev->sdev_state != SDEV_QUIESCE)
> +               rtn = shost->hostt->queuecommand(shost, scmd);
> +       else
> +               rtn = SCSI_MLQUEUE_DEVICE_BUSY;
> 
> That sets rtn instead of calling queuecommand
> 
> Then you drop through to this code below:
> 
>       if (rtn) {
>               if (timeleft > stall_for) {
>                       scsi_eh_restore_cmnd(scmd, &ses);
>                       timeleft -= stall_for;
>                       msleep(jiffies_to_msecs(stall_for));
>                       goto retry;
>               }
> 
> Which causes a msleep which is equivalent to the while loop.

Hello James,

Thanks for the clarification - apparently we were each looking at another
part of the code.

If the "rtn = SCSI_MLQUEUE_DEVICE_BUSY" statement is executed that means that
the if-statement that controls that statement noticed that sdev->sdev_state ==
SDEV_QUIESCE. Since the while loop above that statement only finishes if
either sdev->sdev_state != SDEV_QUIESCE or timeleft <= 0, if the "rtn =
SCSI_MLQUEUE_DEVICE_BUSY" statement is executed that implies that timeleft <=
0. Since stall_for > 0, the expression timeleft > stall_for will evaluate to
false. In other words, the msleep() shown in your e-mail will be skipped.

Bart.


Reply via email to