On Mon, 2015-10-19 at 16:35 +0200, Christoph Hellwig wrote: > When dropping a lock while iterating a list we must restart the > search > as other threads could have manipulated the list under us. Without > this > we can get stuck in an endless loop. > > Reported-by: Johannes Thumshirn <jthumshirn@xxxxxxx> > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > > diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c > index b333389f..d3b34d8 100644 > --- a/drivers/scsi/scsi_sysfs.c > +++ b/drivers/scsi/scsi_sysfs.c > @@ -1158,31 +1158,23 @@ static void __scsi_remove_target(struct > scsi_target *starget) > void scsi_remove_target(struct device *dev) > { > struct Scsi_Host *shost = dev_to_shost(dev->parent); > - struct scsi_target *starget, *last = NULL; > + struct scsi_target *starget; > unsigned long flags; > > - /* remove targets being careful to lookup next entry before > - * deleting the last > - */ > +restart: > spin_lock_irqsave(shost->host_lock, flags); > list_for_each_entry(starget, &shost->__targets, siblings) { > if (starget->state == STARGET_DEL) > continue; > if (starget->dev.parent == dev || &starget->dev == > dev) { > - /* assuming new targets arrive at the end */ > kref_get(&starget->reap_ref); > spin_unlock_irqrestore(shost->host_lock, > flags); > - if (last) > - scsi_target_reap(last); > - last = starget; > __scsi_remove_target(starget); > - spin_lock_irqsave(shost->host_lock, flags); > + scsi_target_reap(starget); > + goto restart; > } > } > spin_unlock_irqrestore(shost->host_lock, flags); > - > - if (last) > - scsi_target_reap(last); > } > EXPORT_SYMBOL(scsi_remove_target); Hi Christoph, I haven't heard anything from the original reporter of the lockup but my test's went all O.K., so Tested-by: Johannes Thumshirn <jthumshirn@xxxxxxx> Reviewed-by: Johannes Thumshirn <jthumshirn@xxxxxxx> > > -- > 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 -- 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