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.