Commit 1dfe225e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

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
...@@ -145,6 +145,20 @@ static inline void sas_fail_probe(struct domain_device *dev, const char *func, i ...@@ -145,6 +145,20 @@ static inline void sas_fail_probe(struct domain_device *dev, const char *func, i
func, dev->parent ? "exp-attached" : func, dev->parent ? "exp-attached" :
"direct-attached", "direct-attached",
SAS_ADDR(dev->sas_addr), err); 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); sas_unregister_dev(dev->port, dev);
} }
......
...@@ -926,6 +926,7 @@ static const int device_qfull_result = ...@@ -926,6 +926,7 @@ static const int device_qfull_result =
static const int condition_met_result = SAM_STAT_CONDITION_MET; static const int condition_met_result = SAM_STAT_CONDITION_MET;
static struct dentry *sdebug_debugfs_root; static struct dentry *sdebug_debugfs_root;
static ASYNC_DOMAIN_EXCLUSIVE(sdebug_async_domain);
static void sdebug_err_free(struct rcu_head *head) static void sdebug_err_free(struct rcu_head *head)
{ {
...@@ -1148,6 +1149,8 @@ static int sdebug_target_alloc(struct scsi_target *starget) ...@@ -1148,6 +1149,8 @@ static int sdebug_target_alloc(struct scsi_target *starget)
if (!targetip) if (!targetip)
return -ENOMEM; return -ENOMEM;
async_synchronize_full_domain(&sdebug_async_domain);
targetip->debugfs_entry = debugfs_create_dir(dev_name(&starget->dev), targetip->debugfs_entry = debugfs_create_dir(dev_name(&starget->dev),
sdebug_debugfs_root); sdebug_debugfs_root);
...@@ -1174,7 +1177,8 @@ static void sdebug_target_destroy(struct scsi_target *starget) ...@@ -1174,7 +1177,8 @@ static void sdebug_target_destroy(struct scsi_target *starget)
targetip = (struct sdebug_target_info *)starget->hostdata; targetip = (struct sdebug_target_info *)starget->hostdata;
if (targetip) { if (targetip) {
starget->hostdata = NULL; starget->hostdata = NULL;
async_schedule(sdebug_tartget_cleanup_async, targetip); async_schedule_domain(sdebug_tartget_cleanup_async, targetip,
&sdebug_async_domain);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment