On Fri, 2013-08-09 at 01:09 +0000, Brandt, Todd E wrote: > static struct ata_force_ent *ata_force_tbl; > static int ata_force_tbl_size; > +int ata_resume_status; A single global variable for multiple ports? > static char ata_force_param_buf[PAGE_SIZE] __initdata; > /* param_buf is thrown away after initialization, disallow read */ > @@ -5415,6 +5416,22 @@ static int ata_port_resume(struct device *dev) > return rc; > } > > +static int ata_port_resume_async(struct device *dev) > +{ > + struct ata_port *ap = to_ata_port(dev); > + > + ata_resume_status = 0; > + ata_port_request_pm(ap, PMSG_RESUME, ATA_EH_RESET, > + ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, &ata_resume_status); If this ever runs in paralell it is extremely racy. > + if (!ata_resume_status) { > + pm_runtime_disable(dev); > + pm_runtime_set_active(dev); > + pm_runtime_enable(dev); > + } > + > + return ata_resume_status; > +} > + > + req = blk_get_request(sdkp->device->request_queue, 0, __GFP_WAIT); What happens if commands go to the device before this has finished? Especially should it fail. Regards Oliver -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html