On Thu, 2017-12-21 at 17:59 +0000, Bart Van Assche wrote:
> On Thu, 2017-12-21 at 09:33 -0800, Raghava Aditya Renukunta wrote:
> > +static void aac_wait_for_io_completion(struct aac_dev *aac)
> > +{
> > +   unsigned long flagv = 0;
> > +   int i = 0;
> > +
> > +   for (i = 60; i; --i) {
> > +           struct scsi_device *dev;
> > +           struct scsi_cmnd *command;
> > +           int active = 0;
> > +
> > +           __shost_for_each_device(dev, aac->scsi_host_ptr) {
> > +                   spin_lock_irqsave(&dev->list_lock, flagv);
> > +                   list_for_each_entry(command, &dev->cmd_list, list) {
> > +                           if (command->SCp.phase == AAC_OWNER_FIRMWARE) {
> > +                                   active++;
> > +                                   break;
> > +                           }
> > +                   }
> > +                   spin_unlock_irqrestore(&dev->list_lock, flagv);
> > +                   if (active)
> > +                           break;
> > +
> > +           }
> > +           /*
> > +            * We can exit If all the commands are complete
> > +            */
> > +           if (active == 0)
> > +                   break;
> > +           ssleep(1);
> > +   }
> > +}
> 
> Have you considered to call scsi_target_block() and scsi_target_unblock() 
> instead
> of implementing functionality like the above in a SCSI LLD?

(replying to my own e-mail)

It seems like I misread your code - calling scsi_target_block() and
scsi_target_unblock() would not be sufficient. But calling blk_mq_freeze_queue()
and blk_mq_unfreeze_queue() should be sufficient. The following commit made 
these
functions work not only for scsi-mq but also for legacy scsi queues: commit
055f6e18e08f ("block: Make q_usage_counter also track legacy requests").

Bart.

Reply via email to