aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_scan.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dtor_core@ameritech.net>2005-09-04 01:35:56 -0500
committerDmitry Torokhov <dtor_core@ameritech.net>2005-09-04 01:35:56 -0500
commit15c42e5a1f0bccb69508059b8ae0720840068b8e (patch)
tree921b088cc7acb50bb8b65dbc30451a8a3958ec8d /drivers/scsi/scsi_scan.c
parent541e316aed6f7d6efeb427a88645c2a8f61418d6 (diff)
parentf505380ba7b98ec97bf25300c2a58aeae903530b (diff)
downloadkernel_samsung_tuna-15c42e5a1f0bccb69508059b8ae0720840068b8e.zip
kernel_samsung_tuna-15c42e5a1f0bccb69508059b8ae0720840068b8e.tar.gz
kernel_samsung_tuna-15c42e5a1f0bccb69508059b8ae0720840068b8e.tar.bz2
Merge HEAD from rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'drivers/scsi/scsi_scan.c')
-rw-r--r--drivers/scsi/scsi_scan.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 2d3c4ac..48edd67 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -336,9 +336,23 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
unsigned long flags;
const int size = sizeof(struct scsi_target)
+ shost->transportt->target_size;
- struct scsi_target *starget = kmalloc(size, GFP_ATOMIC);
+ struct scsi_target *starget;
struct scsi_target *found_target;
+ /*
+ * Obtain the real parent from the transport. The transport
+ * is allowed to fail (no error) if there is nothing at that
+ * target id.
+ */
+ if (shost->transportt->target_parent) {
+ spin_lock_irqsave(shost->host_lock, flags);
+ parent = shost->transportt->target_parent(shost, channel, id);
+ spin_unlock_irqrestore(shost->host_lock, flags);
+ if (!parent)
+ return NULL;
+ }
+
+ starget = kmalloc(size, GFP_KERNEL);
if (!starget) {
printk(KERN_ERR "%s: allocation failure\n", __FUNCTION__);
return NULL;