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?

Thanks,

Bart.

Reply via email to