Skip to content

Commit

Permalink
[SCSI] esp: tidy up target reference counting
Browse files Browse the repository at this point in the history
The esp driver currently does hand rolled reference counting of its
target.  It's much easier to do what it needs to do if it's plugged into
the mid-layer callbacks (target_alloc and target_destroy) which were
designed for this case, so do it this way and get rid of the internal
target reference count.

Acked-by: David S. Miller <davem@davemloft.net>
Cc: Stable Tree <stable@kernel.org>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
  • Loading branch information
James Bottomley authored and James Bottomley committed Jun 25, 2008
1 parent eadc49b commit ec5e69f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 11 deletions.
30 changes: 20 additions & 10 deletions drivers/scsi/esp_scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion drivers/scsi/esp_scsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,6 @@ struct esp_target_data {
u8 nego_goal_tags;

struct scsi_target *starget;
int starget_ref;
};

struct esp_event_ent {
Expand Down

0 comments on commit ec5e69f

Please sign in to comment.