Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd8fc10e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull SCSI fixes from James Bottomley:
 "Two simple fixes.

  One prevents a soft lockup on some target removal scenarios and the
  other prevents us trying to probe the marvell console device, which
  causes it to time out and need the bus resetting"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: fix soft lockup in scsi_remove_target() on module removal
  SCSI: Add Marvell configuration device to VPD blacklist
parents 28507135 2a8d9cdc
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -206,6 +206,7 @@ static struct {
	{"iRiver", "iFP Mass Driver", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36},
	{"iRiver", "iFP Mass Driver", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36},
	{"LASOUND", "CDX7405", "3.10", BLIST_MAX5LUN | BLIST_SINGLELUN},
	{"LASOUND", "CDX7405", "3.10", BLIST_MAX5LUN | BLIST_SINGLELUN},
	{"Marvell", "Console", NULL, BLIST_SKIP_VPD_PAGES},
	{"Marvell", "Console", NULL, BLIST_SKIP_VPD_PAGES},
	{"Marvell", "91xx Config", "1.01", BLIST_SKIP_VPD_PAGES},
	{"MATSHITA", "PD-1", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
	{"MATSHITA", "PD-1", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
	{"MATSHITA", "DMC-LC5", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36},
	{"MATSHITA", "DMC-LC5", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36},
	{"MATSHITA", "DMC-LC40", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36},
	{"MATSHITA", "DMC-LC40", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36},
+4 −2
Original line number Original line Diff line number Diff line
@@ -1272,16 +1272,18 @@ static void __scsi_remove_target(struct scsi_target *starget)
void scsi_remove_target(struct device *dev)
void scsi_remove_target(struct device *dev)
{
{
	struct Scsi_Host *shost = dev_to_shost(dev->parent);
	struct Scsi_Host *shost = dev_to_shost(dev->parent);
	struct scsi_target *starget;
	struct scsi_target *starget, *last_target = NULL;
	unsigned long flags;
	unsigned long flags;


restart:
restart:
	spin_lock_irqsave(shost->host_lock, flags);
	spin_lock_irqsave(shost->host_lock, flags);
	list_for_each_entry(starget, &shost->__targets, siblings) {
	list_for_each_entry(starget, &shost->__targets, siblings) {
		if (starget->state == STARGET_DEL)
		if (starget->state == STARGET_DEL ||
		    starget == last_target)
			continue;
			continue;
		if (starget->dev.parent == dev || &starget->dev == dev) {
		if (starget->dev.parent == dev || &starget->dev == dev) {
			kref_get(&starget->reap_ref);
			kref_get(&starget->reap_ref);
			last_target = starget;
			spin_unlock_irqrestore(shost->host_lock, flags);
			spin_unlock_irqrestore(shost->host_lock, flags);
			__scsi_remove_target(starget);
			__scsi_remove_target(starget);
			scsi_target_reap(starget);
			scsi_target_reap(starget);