On Fri, 2018-03-16 at 23:10 +0000, Bart Van Assche wrote:
> 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.
Not if you remove the while loop from the patch which was the original
request.
James