Re: [PATCH v2] scsi: Avoid that .queuecommand() gets called for a quiesced SCSI device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.






[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux