|
@@ -2359,6 +2359,24 @@ void scsi_esp_unregister(struct esp *esp)
|
|
|
}
|
|
|
EXPORT_SYMBOL(scsi_esp_unregister);
|
|
|
|
|
|
+static int esp_target_alloc(struct scsi_target *starget)
|
|
|
+{
|
|
|
+ struct esp *esp = shost_priv(dev_to_shost(&starget->dev));
|
|
|
+ struct esp_target_data *tp = &esp->target[starget->id];
|
|
|
+
|
|
|
+ tp->starget = starget;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void esp_target_destroy(struct scsi_target *starget)
|
|
|
+{
|
|
|
+ struct esp *esp = shost_priv(dev_to_shost(&starget->dev));
|
|
|
+ struct esp_target_data *tp = &esp->target[starget->id];
|
|
|
+
|
|
|
+ tp->starget = NULL;
|
|
|
+}
|
|
|
+
|
|
|
static int esp_slave_alloc(struct scsi_device *dev)
|
|
|
{
|
|
|
struct esp *esp = shost_priv(dev->host);
|
|
@@ -2370,9 +2388,6 @@ static int esp_slave_alloc(struct scsi_device *dev)
|
|
|
return -ENOMEM;
|
|
|
dev->hostdata = lp;
|
|
|
|
|
|
- tp->starget = dev->sdev_target;
|
|
|
- tp->starget_ref++;
|
|
|
-
|
|
|
spi_min_period(tp->starget) = esp->min_period;
|
|
|
spi_max_offset(tp->starget) = 15;
|
|
|
|
|
@@ -2426,17 +2441,10 @@ static int esp_slave_configure(struct scsi_device *dev)
|
|
|
|
|
|
static void esp_slave_destroy(struct scsi_device *dev)
|
|
|
{
|
|
|
- struct esp *esp = shost_priv(dev->host);
|
|
|
- struct esp_target_data *tp = &esp->target[dev->id];
|
|
|
struct esp_lun_data *lp = dev->hostdata;
|
|
|
|
|
|
kfree(lp);
|
|
|
dev->hostdata = NULL;
|
|
|
-
|
|
|
- BUG_ON(tp->starget_ref <= 0);
|
|
|
-
|
|
|
- if (!--tp->starget_ref)
|
|
|
- tp->starget = NULL;
|
|
|
}
|
|
|
|
|
|
static int esp_eh_abort_handler(struct scsi_cmnd *cmd)
|
|
@@ -2616,6 +2624,8 @@ struct scsi_host_template scsi_esp_template = {
|
|
|
.name = "esp",
|
|
|
.info = esp_info,
|
|
|
.queuecommand = esp_queuecommand,
|
|
|
+ .target_alloc = esp_target_alloc,
|
|
|
+ .target_destroy = esp_target_destroy,
|
|
|
.slave_alloc = esp_slave_alloc,
|
|
|
.slave_configure = esp_slave_configure,
|
|
|
.slave_destroy = esp_slave_destroy,
|