scsi: libfc: Stop using the SCSI pointer
Move the fc_fcp_pkt pointer, the residual length and the SCSI status into the new data structure libfc_cmd_priv. This patch prepares for removal of the SCSI pointer from struct scsi_cmnd. The user of the libfc data path functions have been identified as follows: $ git grep -lw fc_queuecommand | grep -v scsi/libfc/ drivers/scsi/fcoe/fcoe.c Link: https://lore.kernel.org/r/20220218195117.25689-28-bvanassche@acm.org Cc: Saurav Kashyap <skashyap@marvell.com> Cc: Javed Hasan <jhasan@marvell.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Родитель
09cc102bb4
Коммит
5d21aa3636
|
@ -277,6 +277,7 @@ static struct scsi_host_template fcoe_shost_template = {
|
|||
.sg_tablesize = SG_ALL,
|
||||
.max_sectors = 0xffff,
|
||||
.track_queue_depth = 1,
|
||||
.cmd_size = sizeof(struct libfc_cmd_priv),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -45,14 +45,10 @@ static struct kmem_cache *scsi_pkt_cachep;
|
|||
#define FC_SRB_READ (1 << 1)
|
||||
#define FC_SRB_WRITE (1 << 0)
|
||||
|
||||
/*
|
||||
* The SCp.ptr should be tested and set under the scsi_pkt_queue lock
|
||||
*/
|
||||
#define CMD_SP(Cmnd) ((struct fc_fcp_pkt *)(Cmnd)->SCp.ptr)
|
||||
#define CMD_ENTRY_STATUS(Cmnd) ((Cmnd)->SCp.have_data_in)
|
||||
#define CMD_COMPL_STATUS(Cmnd) ((Cmnd)->SCp.this_residual)
|
||||
#define CMD_SCSI_STATUS(Cmnd) ((Cmnd)->SCp.Status)
|
||||
#define CMD_RESID_LEN(Cmnd) ((Cmnd)->SCp.buffers_residual)
|
||||
static struct libfc_cmd_priv *libfc_priv(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return scsi_cmd_priv(cmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct fc_fcp_internal - FCP layer internal data
|
||||
|
@ -1137,7 +1133,7 @@ static int fc_fcp_pkt_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp)
|
|||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
fsp->cmd->SCp.ptr = (char *)fsp;
|
||||
libfc_priv(fsp->cmd)->fsp = fsp;
|
||||
fsp->cdb_cmd.fc_dl = htonl(fsp->data_len);
|
||||
fsp->cdb_cmd.fc_flags = fsp->req_flags & ~FCP_CFL_LEN_MASK;
|
||||
|
||||
|
@ -1150,7 +1146,7 @@ static int fc_fcp_pkt_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp)
|
|||
rc = lport->tt.fcp_cmd_send(lport, fsp, fc_fcp_recv);
|
||||
if (unlikely(rc)) {
|
||||
spin_lock_irqsave(&si->scsi_queue_lock, flags);
|
||||
fsp->cmd->SCp.ptr = NULL;
|
||||
libfc_priv(fsp->cmd)->fsp = NULL;
|
||||
list_del(&fsp->list);
|
||||
spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
|
||||
}
|
||||
|
@ -1983,7 +1979,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
|
|||
fc_fcp_can_queue_ramp_up(lport);
|
||||
|
||||
sc_cmd = fsp->cmd;
|
||||
CMD_SCSI_STATUS(sc_cmd) = fsp->cdb_status;
|
||||
libfc_priv(sc_cmd)->status = fsp->cdb_status;
|
||||
switch (fsp->status_code) {
|
||||
case FC_COMPLETE:
|
||||
if (fsp->cdb_status == 0) {
|
||||
|
@ -1992,7 +1988,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
|
|||
*/
|
||||
sc_cmd->result = DID_OK << 16;
|
||||
if (fsp->scsi_resid)
|
||||
CMD_RESID_LEN(sc_cmd) = fsp->scsi_resid;
|
||||
libfc_priv(sc_cmd)->resid_len = fsp->scsi_resid;
|
||||
} else {
|
||||
/*
|
||||
* transport level I/O was ok but scsi
|
||||
|
@ -2025,7 +2021,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
|
|||
*/
|
||||
FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
|
||||
"due to FC_DATA_UNDRUN (scsi)\n");
|
||||
CMD_RESID_LEN(sc_cmd) = fsp->scsi_resid;
|
||||
libfc_priv(sc_cmd)->resid_len = fsp->scsi_resid;
|
||||
sc_cmd->result = (DID_ERROR << 16) | fsp->cdb_status;
|
||||
}
|
||||
break;
|
||||
|
@ -2085,7 +2081,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
|
|||
|
||||
spin_lock_irqsave(&si->scsi_queue_lock, flags);
|
||||
list_del(&fsp->list);
|
||||
sc_cmd->SCp.ptr = NULL;
|
||||
libfc_priv(sc_cmd)->fsp = NULL;
|
||||
spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
|
||||
scsi_done(sc_cmd);
|
||||
|
||||
|
@ -2121,7 +2117,7 @@ int fc_eh_abort(struct scsi_cmnd *sc_cmd)
|
|||
|
||||
si = fc_get_scsi_internal(lport);
|
||||
spin_lock_irqsave(&si->scsi_queue_lock, flags);
|
||||
fsp = CMD_SP(sc_cmd);
|
||||
fsp = libfc_priv(sc_cmd)->fsp;
|
||||
if (!fsp) {
|
||||
/* command completed while scsi eh was setting up */
|
||||
spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
|
||||
|
|
|
@ -351,6 +351,15 @@ struct fc_fcp_pkt {
|
|||
struct completion tm_done;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/*
|
||||
* @fsp should be tested and set under the scsi_pkt_queue lock
|
||||
*/
|
||||
struct libfc_cmd_priv {
|
||||
struct fc_fcp_pkt *fsp;
|
||||
u32 resid_len;
|
||||
u8 status;
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure and function definitions for managing Fibre Channel Exchanges
|
||||
* and Sequences
|
||||
|
|
Загрузка…
Ссылка в новой задаче