Commit 09236994 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

Pull SCSI target fixes from Nicholas Bellinger:
 "The executive summary includes:

   - Post-merge review comments for tcm_vhost (MST + nab)
   - Avoid debugging overhead when not debugging for tcm-fc(FCoE) (MDR)
   - Fix NULL pointer dereference bug on alloc_page failulre (Yi Zou)
   - Fix REPORT_LUNs regression bug with pSCSI export (AlexE + nab)
   - Fix regression bug with handling of zero-length data CDBs (nab)
   - Fix vhost_scsi_target structure alignment (MST)

  Thanks again to everyone who contributed a bugfix patch, gave review
  feedback on tcm_vhost code, and/or reported a bug during their own
  testing over the last weeks.

  There is one other outstanding bug reported by Roland recently related
  to SCSI transfer length overflow handling, for which the current
  proposed bugfix has been left in queue pending further testing with
  other non iscsi-target based fabric drivers.

  As the patch is verified with loopback (local SGL memory from SCSI
  LLD) + tcm_qla2xxx (TCM allocated SGL memory mapped to PCI HW) fabric
  ports, it will be included into the next 3.6-rc-fixes PULL request."

* git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
  target: Remove unused se_cmd.cmd_spdtl
  tcm_fc: rcu_deref outside rcu lock/unlock section
  tcm_vhost: Fix vhost_scsi_target structure alignment
  target: Fix regression bug with handling of zero-length data CDBs
  target/pscsi: Fix bug with REPORT_LUNs handling for SCSI passthrough
  tcm_vhost: Change vhost_scsi_target->vhost_wwpn to char *
  target: fix NULL pointer dereference bug alloc_page() fails to get memory
  tcm_fc: Avoid debug overhead when not debugging
  tcm_vhost: Post-merge review changes requested by MST
  tcm_vhost: Fix incorrect IS_ERR() usage in vhost_scsi_map_iov_to_sgl
parents 2e2d8c93 af74115e
...@@ -673,8 +673,15 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg) ...@@ -673,8 +673,15 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg)
struct scsi_device *sd = pdv->pdv_sd; struct scsi_device *sd = pdv->pdv_sd;
int result; int result;
struct pscsi_plugin_task *pt = cmd->priv; struct pscsi_plugin_task *pt = cmd->priv;
unsigned char *cdb = &pt->pscsi_cdb[0]; unsigned char *cdb;
/*
* Special case for REPORT_LUNs handling where pscsi_plugin_task has
* not been allocated because TCM is handling the emulation directly.
*/
if (!pt)
return 0;
cdb = &pt->pscsi_cdb[0];
result = pt->pscsi_result; result = pt->pscsi_result;
/* /*
* Hack to make sure that Write-Protect modepage is set if R/O mode is * Hack to make sure that Write-Protect modepage is set if R/O mode is
......
...@@ -1165,8 +1165,6 @@ int target_cmd_size_check(struct se_cmd *cmd, unsigned int size) ...@@ -1165,8 +1165,6 @@ int target_cmd_size_check(struct se_cmd *cmd, unsigned int size)
" 0x%02x\n", cmd->se_tfo->get_fabric_name(), " 0x%02x\n", cmd->se_tfo->get_fabric_name(),
cmd->data_length, size, cmd->t_task_cdb[0]); cmd->data_length, size, cmd->t_task_cdb[0]);
cmd->cmd_spdtl = size;
if (cmd->data_direction == DMA_TO_DEVICE) { if (cmd->data_direction == DMA_TO_DEVICE) {
pr_err("Rejecting underflow/overflow" pr_err("Rejecting underflow/overflow"
" WRITE data\n"); " WRITE data\n");
...@@ -2294,9 +2292,9 @@ transport_generic_get_mem(struct se_cmd *cmd) ...@@ -2294,9 +2292,9 @@ transport_generic_get_mem(struct se_cmd *cmd)
return 0; return 0;
out: out:
while (i >= 0) { while (i > 0) {
__free_page(sg_page(&cmd->t_data_sg[i]));
i--; i--;
__free_page(sg_page(&cmd->t_data_sg[i]));
} }
kfree(cmd->t_data_sg); kfree(cmd->t_data_sg);
cmd->t_data_sg = NULL; cmd->t_data_sg = NULL;
...@@ -2323,9 +2321,12 @@ int transport_generic_new_cmd(struct se_cmd *cmd) ...@@ -2323,9 +2321,12 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
if (ret < 0) if (ret < 0)
goto out_fail; goto out_fail;
} }
/*
/* Workaround for handling zero-length control CDBs */ * If this command doesn't have any payload and we don't have to call
if (!(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) && !cmd->data_length) { * into the fabric for data transfers, go ahead and complete it right
* away.
*/
if (!cmd->data_length) {
spin_lock_irq(&cmd->t_state_lock); spin_lock_irq(&cmd->t_state_lock);
cmd->t_state = TRANSPORT_COMPLETE; cmd->t_state = TRANSPORT_COMPLETE;
cmd->transport_state |= CMD_T_ACTIVE; cmd->transport_state |= CMD_T_ACTIVE;
......
...@@ -131,6 +131,7 @@ extern struct list_head ft_lport_list; ...@@ -131,6 +131,7 @@ extern struct list_head ft_lport_list;
extern struct mutex ft_lport_lock; extern struct mutex ft_lport_lock;
extern struct fc4_prov ft_prov; extern struct fc4_prov ft_prov;
extern struct target_fabric_configfs *ft_configfs; extern struct target_fabric_configfs *ft_configfs;
extern unsigned int ft_debug_logging;
/* /*
* Fabric methods. * Fabric methods.
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
/* /*
* Dump cmd state for debugging. * Dump cmd state for debugging.
*/ */
void ft_dump_cmd(struct ft_cmd *cmd, const char *caller) static void _ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
{ {
struct fc_exch *ep; struct fc_exch *ep;
struct fc_seq *sp; struct fc_seq *sp;
...@@ -80,6 +80,12 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller) ...@@ -80,6 +80,12 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
} }
} }
void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
{
if (unlikely(ft_debug_logging))
_ft_dump_cmd(cmd, caller);
}
static void ft_free_cmd(struct ft_cmd *cmd) static void ft_free_cmd(struct ft_cmd *cmd)
{ {
struct fc_frame *fp; struct fc_frame *fp;
......
...@@ -456,7 +456,9 @@ static void ft_prlo(struct fc_rport_priv *rdata) ...@@ -456,7 +456,9 @@ static void ft_prlo(struct fc_rport_priv *rdata)
struct ft_tport *tport; struct ft_tport *tport;
mutex_lock(&ft_lport_lock); mutex_lock(&ft_lport_lock);
tport = rcu_dereference(rdata->local_port->prov[FC_TYPE_FCP]); tport = rcu_dereference_protected(rdata->local_port->prov[FC_TYPE_FCP],
lockdep_is_held(&ft_lport_lock));
if (!tport) { if (!tport) {
mutex_unlock(&ft_lport_lock); mutex_unlock(&ft_lport_lock);
return; return;
......
This diff is collapsed.
...@@ -47,9 +47,9 @@ struct tcm_vhost_tpg { ...@@ -47,9 +47,9 @@ struct tcm_vhost_tpg {
/* Vhost port target portal group tag for TCM */ /* Vhost port target portal group tag for TCM */
u16 tport_tpgt; u16 tport_tpgt;
/* Used to track number of TPG Port/Lun Links wrt to explict I_T Nexus shutdown */ /* Used to track number of TPG Port/Lun Links wrt to explict I_T Nexus shutdown */
atomic_t tv_tpg_port_count; int tv_tpg_port_count;
/* Used for vhost_scsi device reference to tpg_nexus */ /* Used for vhost_scsi device reference to tpg_nexus, protected by tv_tpg_mutex */
atomic_t tv_tpg_vhost_count; int tv_tpg_vhost_count;
/* list for tcm_vhost_list */ /* list for tcm_vhost_list */
struct list_head tv_tpg_list; struct list_head tv_tpg_list;
/* Used to protect access for tpg_nexus */ /* Used to protect access for tpg_nexus */
...@@ -91,11 +91,13 @@ struct tcm_vhost_tport { ...@@ -91,11 +91,13 @@ struct tcm_vhost_tport {
struct vhost_scsi_target { struct vhost_scsi_target {
int abi_version; int abi_version;
unsigned char vhost_wwpn[TRANSPORT_IQN_LEN]; char vhost_wwpn[TRANSPORT_IQN_LEN];
unsigned short vhost_tpgt; unsigned short vhost_tpgt;
unsigned short reserved;
}; };
/* VHOST_SCSI specific defines */ /* VHOST_SCSI specific defines */
#define VHOST_SCSI_SET_ENDPOINT _IOW(VHOST_VIRTIO, 0x40, struct vhost_scsi_target) #define VHOST_SCSI_SET_ENDPOINT _IOW(VHOST_VIRTIO, 0x40, struct vhost_scsi_target)
#define VHOST_SCSI_CLEAR_ENDPOINT _IOW(VHOST_VIRTIO, 0x41, struct vhost_scsi_target) #define VHOST_SCSI_CLEAR_ENDPOINT _IOW(VHOST_VIRTIO, 0x41, struct vhost_scsi_target)
#define VHOST_SCSI_GET_ABI_VERSION _IOW(VHOST_VIRTIO, 0x42, struct vhost_scsi_target) /* Changing this breaks userspace. */
#define VHOST_SCSI_GET_ABI_VERSION _IOW(VHOST_VIRTIO, 0x42, int)
...@@ -503,8 +503,6 @@ struct se_cmd { ...@@ -503,8 +503,6 @@ struct se_cmd {
u32 se_ordered_id; u32 se_ordered_id;
/* Total size in bytes associated with command */ /* Total size in bytes associated with command */
u32 data_length; u32 data_length;
/* SCSI Presented Data Transfer Length */
u32 cmd_spdtl;
u32 residual_count; u32 residual_count;
u32 orig_fe_lun; u32 orig_fe_lun;
/* Persistent Reservation key */ /* Persistent Reservation key */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment