James:
This patch (as542) fixes a few loose ends left by Mike's patches. It adds
a declaration for the new scsi_host_set_state routine, adds an allowed
transition from the SHOST_RECOVERY state to the SHOST_CANCEL state, and
avoids returning an uninitialized value in __scsi_add_device.
Alan Stern
Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
Index: 2613/include/scsi/scsi_host.h
===================================================================
--- 2613.orig/include/scsi/scsi_host.h
+++ 2613/include/scsi/scsi_host.h
@@ -636,6 +636,7 @@ extern void scsi_remove_host(struct Scsi
extern struct Scsi_Host *scsi_host_get(struct Scsi_Host *);
extern void scsi_host_put(struct Scsi_Host *t);
extern struct Scsi_Host *scsi_host_lookup(unsigned short);
+extern int scsi_host_set_state(struct Scsi_Host *, enum scsi_host_state);
extern const char *scsi_host_state_name(enum scsi_host_state);
extern u64 scsi_calculate_bounce_limit(struct Scsi_Host *);
Index: 2613/drivers/scsi/hosts.c
===================================================================
--- 2613.orig/drivers/scsi/hosts.c
+++ 2613/drivers/scsi/hosts.c
@@ -97,6 +97,7 @@ int scsi_host_set_state(struct Scsi_Host
switch (oldstate) {
case SHOST_CREATED:
case SHOST_RUNNING:
+ case SHOST_RECOVERY:
break;
default:
goto illegal;
Index: 2613/drivers/scsi/scsi_scan.c
===================================================================
--- 2613.orig/drivers/scsi/scsi_scan.c
+++ 2613/drivers/scsi/scsi_scan.c
@@ -1210,25 +1210,28 @@ struct scsi_device *__scsi_add_device(st
uint id, uint lun, void *hostdata)
{
struct scsi_device *sdev;
- struct device *parent = &shost->shost_gendev;
- int res;
- struct scsi_target *starget = scsi_alloc_target(parent, channel, id);
-
- if (!starget)
- return ERR_PTR(-ENOMEM);
+ struct scsi_target *starget;
- get_device(&starget->dev);
down(&shost->scan_mutex);
- if (scsi_host_scan_allowed(shost)) {
- res = scsi_probe_and_add_lun(starget, lun, NULL, &sdev, 1,
- hostdata);
- if (res != SCSI_SCAN_LUN_PRESENT)
- sdev = ERR_PTR(-ENODEV);
+ if (!scsi_host_scan_allowed(shost)) {
+ sdev = ERR_PTR(-ENODEV);
+ goto out;
}
- up(&shost->scan_mutex);
+ starget = scsi_alloc_target(&shost->shost_gendev, channel, id);
+ if (!starget) {
+ sdev = ERR_PTR(-ENOMEM);
+ goto out;
+ }
+
+ get_device(&starget->dev);
+ if (scsi_probe_and_add_lun(starget, lun, NULL, &sdev, 1, hostdata)
+ != SCSI_SCAN_LUN_PRESENT)
+ sdev = ERR_PTR(-ENODEV);
scsi_target_reap(starget);
put_device(&starget->dev);
+ out:
+ up(&shost->scan_mutex);
return sdev;
}
EXPORT_SYMBOL(__scsi_add_device);
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html