Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 204077
b: refs/heads/master
c: 083a469
h: refs/heads/master
i:
  204075: ee63bb9
v: v3
  • Loading branch information
Giridhar Malavali authored and James Bottomley committed Jul 27, 2010
1 parent 7da742d commit 5fb3093
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7e2b895b93db603ac3462175baa846ebf1be44da
refs/heads/master: 083a469db4ecf3b286a96b5b722c37fc1affe0be
1 change: 1 addition & 0 deletions trunk/drivers/scsi/qla2xxx/qla_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ struct sd_dif_tuple {
* SCSI Request Block
*/
typedef struct srb {
atomic_t ref_count;
struct fc_port *fcport;
uint32_t handle;

Expand Down
31 changes: 30 additions & 1 deletion trunk/drivers/scsi/qla2xxx/qla_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,7 @@ qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport,
if (!sp)
return sp;

atomic_set(&sp->ref_count, 1);
sp->fcport = fcport;
sp->cmd = cmd;
sp->flags = 0;
Expand Down Expand Up @@ -797,6 +798,12 @@ qla2x00_wait_for_loop_ready(scsi_qla_host_t *vha)
return (return_status);
}

static void
sp_get(struct srb *sp)
{
atomic_inc(&sp->ref_count);
}

/**************************************************************************
* qla2xxx_eh_abort
*
Expand Down Expand Up @@ -825,6 +832,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
struct qla_hw_data *ha = vha->hw;
struct req_que *req = vha->req;
srb_t *spt;
int got_ref = 0;

fc_block_scsi_eh(cmd);

Expand Down Expand Up @@ -856,6 +864,10 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
DEBUG2(printk("%s(%ld): aborting sp %p from RISC."
" pid=%ld.\n", __func__, vha->host_no, sp, serial));

/* Get a reference to the sp and drop the lock.*/
sp_get(sp);
got_ref++;

spin_unlock_irqrestore(&ha->hardware_lock, flags);
if (ha->isp_ops->abort_command(sp)) {
DEBUG2(printk("%s(%ld): abort_command "
Expand All @@ -881,6 +893,9 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
}
}

if (got_ref)
qla2x00_sp_compl(ha, sp);

qla_printk(KERN_INFO, ha,
"scsi(%ld:%d:%d): Abort command issued -- %d %lx %x.\n",
vha->host_no, id, lun, wait, serial, ret);
Expand Down Expand Up @@ -3468,7 +3483,7 @@ qla2x00_sp_free_dma(srb_t *sp)
}

void
qla2x00_sp_compl(struct qla_hw_data *ha, srb_t *sp)
qla2x00_sp_final_compl(struct qla_hw_data *ha, srb_t *sp)
{
struct scsi_cmnd *cmd = sp->cmd;

Expand All @@ -3489,6 +3504,20 @@ qla2x00_sp_compl(struct qla_hw_data *ha, srb_t *sp)
cmd->scsi_done(cmd);
}

void
qla2x00_sp_compl(struct qla_hw_data *ha, srb_t *sp)
{
if (atomic_read(&sp->ref_count) == 0) {
DEBUG2(qla_printk(KERN_WARNING, ha,
"SP reference-count to ZERO -- sp=%p\n", sp));
DEBUG2(BUG());
return;
}
if (!atomic_dec_and_test(&sp->ref_count))
return;
qla2x00_sp_final_compl(ha, sp);
}

/**************************************************************************
* qla2x00_timer
*
Expand Down

0 comments on commit 5fb3093

Please sign in to comment.