Commit 1dfe225e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull SCSI fixes from James Bottomley:
 "A couple of error leg problems, one affecting scsi_debug and the other
  affecting pure SAS (i.e. not SATA) SCSI expanders"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: libsas: Fix exp-attached device scan after probe failure scanned in again after probe failed
  scsi: scsi_debug: Fix create target debugfs failure
parents 73e93150 ab2068a6
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -145,6 +145,20 @@ static inline void sas_fail_probe(struct domain_device *dev, const char *func, i
		func, dev->parent ? "exp-attached" :
		"direct-attached",
		SAS_ADDR(dev->sas_addr), err);

	/*
	 * If the device probe failed, the expander phy attached address
	 * needs to be reset so that the phy will not be treated as flutter
	 * in the next revalidation
	 */
	if (dev->parent && !dev_is_expander(dev->dev_type)) {
		struct sas_phy *phy = dev->phy;
		struct domain_device *parent = dev->parent;
		struct ex_phy *ex_phy = &parent->ex_dev.ex_phy[phy->number];

		memset(ex_phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
	}

	sas_unregister_dev(dev->port, dev);
}

+5 −1
Original line number Diff line number Diff line
@@ -926,6 +926,7 @@ static const int device_qfull_result =
static const int condition_met_result = SAM_STAT_CONDITION_MET;

static struct dentry *sdebug_debugfs_root;
static ASYNC_DOMAIN_EXCLUSIVE(sdebug_async_domain);

static void sdebug_err_free(struct rcu_head *head)
{
@@ -1148,6 +1149,8 @@ static int sdebug_target_alloc(struct scsi_target *starget)
	if (!targetip)
		return -ENOMEM;

	async_synchronize_full_domain(&sdebug_async_domain);

	targetip->debugfs_entry = debugfs_create_dir(dev_name(&starget->dev),
				sdebug_debugfs_root);

@@ -1174,7 +1177,8 @@ static void sdebug_target_destroy(struct scsi_target *starget)
	targetip = (struct sdebug_target_info *)starget->hostdata;
	if (targetip) {
		starget->hostdata = NULL;
		async_schedule(sdebug_tartget_cleanup_async, targetip);
		async_schedule_domain(sdebug_tartget_cleanup_async, targetip,
				&sdebug_async_domain);
	}
}