Commit 858f45bf authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

Pull SCSI target updates from Nicholas Bellinger:
 "The highlights include:

   - numerous target-core-user improvements related to queue full and
     timeout handling. (MNC)

   - prevent target-core-user corruption when invalid data page is
     requested. (MNC)

   - add target-core device action configfs attributes to allow
     user-space to trigger events separate from existing attributes
     exposed to end-users. (MNC)

   - fix iscsi-target NULL pointer dereference 4.6+ regression in CHAP
     error path. (David Disseldorp)

   - avoid target-core backend UNMAP callbacks if range is zero. (Andrei
     Vagin)

   - fix a iscsi-target 4.14+ regression related multiple PDU logins,
     that was exposed due to removal of TCP prequeue support. (Florian
     Westphal + MNC)

  Also, there is a iser-target bug still being worked on for post -rc1
  code to address a long standing issue resulting in persistent
  ib_post_send() failures, for RNICs with small max_send_sge"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (36 commits)
  iscsi-target: make sure to wake up sleeping login worker
  tcmu: Fix trailing semicolon
  tcmu: fix cmd user after free
  target: fix destroy device in target_configure_device
  tcmu: allow userspace to reset ring
  target core: add device action configfs files
  tcmu: fix error return code in tcmu_configure_device()
  target_core_user: add cmd id to broken ring message
  target: add SAM_STAT_BUSY sense reason
  tcmu: prevent corruption when invalid data page requested
  target: don't call an unmap callback if a range length is zero
  target/iscsi: avoid NULL dereference in CHAP auth error path
  cxgbit: call neigh_event_send() to update MAC address
  target: tcm_loop: Use seq_puts() in tcm_loop_show_info()
  target: tcm_loop: Delete an unnecessary return statement in tcm_loop_submission_work()
  target: tcm_loop: Delete two unnecessary variable initialisations in tcm_loop_issue_tmr()
  target: tcm_loop: Combine substrings for 26 messages
  target: tcm_loop: Improve a size determination in two functions
  target: tcm_loop: Delete an error message for a failed memory allocation in four functions
  sbp-target: Delete an error message for a failed memory allocation in three functions
  ...
parents 8158c2ff 1c130ae0
...@@ -893,6 +893,9 @@ cxgbit_offload_init(struct cxgbit_sock *csk, int iptype, __u8 *peer_ip, ...@@ -893,6 +893,9 @@ cxgbit_offload_init(struct cxgbit_sock *csk, int iptype, __u8 *peer_ip,
return -ENODEV; return -ENODEV;
rcu_read_lock(); rcu_read_lock();
if (!(n->nud_state & NUD_VALID))
neigh_event_send(n, NULL);
ret = -ENOMEM; ret = -ENOMEM;
if (n->dev->flags & IFF_LOOPBACK) { if (n->dev->flags & IFF_LOOPBACK) {
if (iptype == 4) if (iptype == 4)
......
...@@ -421,6 +421,7 @@ static int chap_server_compute_md5( ...@@ -421,6 +421,7 @@ static int chap_server_compute_md5(
auth_ret = 0; auth_ret = 0;
out: out:
kzfree(desc); kzfree(desc);
if (tfm)
crypto_free_shash(tfm); crypto_free_shash(tfm);
kfree(challenge); kfree(challenge);
kfree(challenge_binhex); kfree(challenge_binhex);
......
...@@ -432,6 +432,9 @@ static void iscsi_target_sk_data_ready(struct sock *sk) ...@@ -432,6 +432,9 @@ static void iscsi_target_sk_data_ready(struct sock *sk)
if (test_and_set_bit(LOGIN_FLAGS_READ_ACTIVE, &conn->login_flags)) { if (test_and_set_bit(LOGIN_FLAGS_READ_ACTIVE, &conn->login_flags)) {
write_unlock_bh(&sk->sk_callback_lock); write_unlock_bh(&sk->sk_callback_lock);
pr_debug("Got LOGIN_FLAGS_READ_ACTIVE=1, conn: %p >>>>\n", conn); pr_debug("Got LOGIN_FLAGS_READ_ACTIVE=1, conn: %p >>>>\n", conn);
if (iscsi_target_sk_data_ready == conn->orig_data_ready)
return;
conn->orig_data_ready(sk);
return; return;
} }
......
This diff is collapsed.
...@@ -201,10 +201,9 @@ static struct sbp_session *sbp_session_create( ...@@ -201,10 +201,9 @@ static struct sbp_session *sbp_session_create(
snprintf(guid_str, sizeof(guid_str), "%016llx", guid); snprintf(guid_str, sizeof(guid_str), "%016llx", guid);
sess = kmalloc(sizeof(*sess), GFP_KERNEL); sess = kmalloc(sizeof(*sess), GFP_KERNEL);
if (!sess) { if (!sess)
pr_err("failed to allocate session descriptor\n");
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
spin_lock_init(&sess->lock); spin_lock_init(&sess->lock);
INIT_LIST_HEAD(&sess->login_list); INIT_LIST_HEAD(&sess->login_list);
INIT_DELAYED_WORK(&sess->maint_work, session_maintenance_work); INIT_DELAYED_WORK(&sess->maint_work, session_maintenance_work);
...@@ -2029,10 +2028,8 @@ static struct se_portal_group *sbp_make_tpg( ...@@ -2029,10 +2028,8 @@ static struct se_portal_group *sbp_make_tpg(
} }
tpg = kzalloc(sizeof(*tpg), GFP_KERNEL); tpg = kzalloc(sizeof(*tpg), GFP_KERNEL);
if (!tpg) { if (!tpg)
pr_err("Unable to allocate struct sbp_tpg\n");
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
tpg->tport = tport; tpg->tport = tport;
tpg->tport_tpgt = tpgt; tpg->tport_tpgt = tpgt;
...@@ -2088,10 +2085,8 @@ static struct se_wwn *sbp_make_tport( ...@@ -2088,10 +2085,8 @@ static struct se_wwn *sbp_make_tport(
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
tport = kzalloc(sizeof(*tport), GFP_KERNEL); tport = kzalloc(sizeof(*tport), GFP_KERNEL);
if (!tport) { if (!tport)
pr_err("Unable to allocate struct sbp_tport\n");
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
tport->guid = guid; tport->guid = guid;
sbp_format_wwn(tport->tport_name, SBP_NAMELEN, guid); sbp_format_wwn(tport->tport_name, SBP_NAMELEN, guid);
......
...@@ -1197,6 +1197,7 @@ struct configfs_attribute *passthrough_attrib_attrs[] = { ...@@ -1197,6 +1197,7 @@ struct configfs_attribute *passthrough_attrib_attrs[] = {
EXPORT_SYMBOL(passthrough_attrib_attrs); EXPORT_SYMBOL(passthrough_attrib_attrs);
TB_CIT_SETUP_DRV(dev_attrib, NULL, NULL); TB_CIT_SETUP_DRV(dev_attrib, NULL, NULL);
TB_CIT_SETUP_DRV(dev_action, NULL, NULL);
/* End functions for struct config_item_type tb_dev_attrib_cit */ /* End functions for struct config_item_type tb_dev_attrib_cit */
...@@ -2940,6 +2941,10 @@ static struct config_group *target_core_make_subdev( ...@@ -2940,6 +2941,10 @@ static struct config_group *target_core_make_subdev(
config_group_init_type_name(&dev->dev_group, name, &tb->tb_dev_cit); config_group_init_type_name(&dev->dev_group, name, &tb->tb_dev_cit);
config_group_init_type_name(&dev->dev_action_group, "action",
&tb->tb_dev_action_cit);
configfs_add_default_group(&dev->dev_action_group, &dev->dev_group);
config_group_init_type_name(&dev->dev_attrib.da_group, "attrib", config_group_init_type_name(&dev->dev_attrib.da_group, "attrib",
&tb->tb_dev_attrib_cit); &tb->tb_dev_attrib_cit);
configfs_add_default_group(&dev->dev_attrib.da_group, &dev->dev_group); configfs_add_default_group(&dev->dev_attrib.da_group, &dev->dev_group);
...@@ -3200,6 +3205,7 @@ static const struct config_item_type target_core_cit = { ...@@ -3200,6 +3205,7 @@ static const struct config_item_type target_core_cit = {
void target_setup_backend_cits(struct target_backend *tb) void target_setup_backend_cits(struct target_backend *tb)
{ {
target_core_setup_dev_cit(tb); target_core_setup_dev_cit(tb);
target_core_setup_dev_action_cit(tb);
target_core_setup_dev_attrib_cit(tb); target_core_setup_dev_attrib_cit(tb);
target_core_setup_dev_pr_cit(tb); target_core_setup_dev_pr_cit(tb);
target_core_setup_dev_wwn_cit(tb); target_core_setup_dev_wwn_cit(tb);
......
...@@ -997,7 +997,7 @@ int target_configure_device(struct se_device *dev) ...@@ -997,7 +997,7 @@ int target_configure_device(struct se_device *dev)
ret = core_setup_alua(dev); ret = core_setup_alua(dev);
if (ret) if (ret)
goto out_free_index; goto out_destroy_device;
/* /*
* Startup the struct se_device processing thread * Startup the struct se_device processing thread
...@@ -1041,6 +1041,8 @@ int target_configure_device(struct se_device *dev) ...@@ -1041,6 +1041,8 @@ int target_configure_device(struct se_device *dev)
out_free_alua: out_free_alua:
core_alua_free_lu_gp_mem(dev); core_alua_free_lu_gp_mem(dev);
out_destroy_device:
dev->transport->destroy_device(dev);
out_free_index: out_free_index:
mutex_lock(&device_mutex); mutex_lock(&device_mutex);
idr_remove(&devices_idr, dev->dev_index); idr_remove(&devices_idr, dev->dev_index);
......
...@@ -273,7 +273,7 @@ static int iscsi_get_pr_transport_id_len( ...@@ -273,7 +273,7 @@ static int iscsi_get_pr_transport_id_len(
static char *iscsi_parse_pr_out_transport_id( static char *iscsi_parse_pr_out_transport_id(
struct se_portal_group *se_tpg, struct se_portal_group *se_tpg,
const char *buf, char *buf,
u32 *out_tid_len, u32 *out_tid_len,
char **port_nexus_ptr) char **port_nexus_ptr)
{ {
...@@ -356,7 +356,7 @@ static char *iscsi_parse_pr_out_transport_id( ...@@ -356,7 +356,7 @@ static char *iscsi_parse_pr_out_transport_id(
} }
} }
return (char *)&buf[4]; return &buf[4];
} }
int target_get_pr_transport_id_len(struct se_node_acl *nacl, int target_get_pr_transport_id_len(struct se_node_acl *nacl,
...@@ -405,7 +405,7 @@ int target_get_pr_transport_id(struct se_node_acl *nacl, ...@@ -405,7 +405,7 @@ int target_get_pr_transport_id(struct se_node_acl *nacl,
} }
const char *target_parse_pr_out_transport_id(struct se_portal_group *tpg, const char *target_parse_pr_out_transport_id(struct se_portal_group *tpg,
const char *buf, u32 *out_tid_len, char **port_nexus_ptr) char *buf, u32 *out_tid_len, char **port_nexus_ptr)
{ {
u32 offset; u32 offset;
......
...@@ -17,6 +17,7 @@ struct target_backend { ...@@ -17,6 +17,7 @@ struct target_backend {
struct config_item_type tb_dev_cit; struct config_item_type tb_dev_cit;
struct config_item_type tb_dev_attrib_cit; struct config_item_type tb_dev_attrib_cit;
struct config_item_type tb_dev_action_cit;
struct config_item_type tb_dev_pr_cit; struct config_item_type tb_dev_pr_cit;
struct config_item_type tb_dev_wwn_cit; struct config_item_type tb_dev_wwn_cit;
struct config_item_type tb_dev_alua_tg_pt_gps_cit; struct config_item_type tb_dev_alua_tg_pt_gps_cit;
...@@ -102,7 +103,7 @@ int target_get_pr_transport_id(struct se_node_acl *nacl, ...@@ -102,7 +103,7 @@ int target_get_pr_transport_id(struct se_node_acl *nacl,
struct t10_pr_registration *pr_reg, int *format_code, struct t10_pr_registration *pr_reg, int *format_code,
unsigned char *buf); unsigned char *buf);
const char *target_parse_pr_out_transport_id(struct se_portal_group *tpg, const char *target_parse_pr_out_transport_id(struct se_portal_group *tpg,
const char *buf, u32 *out_tid_len, char **port_nexus_ptr); char *buf, u32 *out_tid_len, char **port_nexus_ptr);
/* target_core_hba.c */ /* target_core_hba.c */
struct se_hba *core_alloc_hba(const char *, u32, u32); struct se_hba *core_alloc_hba(const char *, u32, u32);
......
...@@ -1601,7 +1601,7 @@ core_scsi3_decode_spec_i_port( ...@@ -1601,7 +1601,7 @@ core_scsi3_decode_spec_i_port(
dest_rtpi = tmp_lun->lun_rtpi; dest_rtpi = tmp_lun->lun_rtpi;
i_str = target_parse_pr_out_transport_id(tmp_tpg, i_str = target_parse_pr_out_transport_id(tmp_tpg,
(const char *)ptr, &tid_len, &iport_ptr); ptr, &tid_len, &iport_ptr);
if (!i_str) if (!i_str)
continue; continue;
...@@ -3287,7 +3287,7 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key, ...@@ -3287,7 +3287,7 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
goto out; goto out;
} }
initiator_str = target_parse_pr_out_transport_id(dest_se_tpg, initiator_str = target_parse_pr_out_transport_id(dest_se_tpg,
(const char *)&buf[24], &tmp_tid_len, &iport_ptr); &buf[24], &tmp_tid_len, &iport_ptr);
if (!initiator_str) { if (!initiator_str) {
pr_err("SPC-3 PR REGISTER_AND_MOVE: Unable to locate" pr_err("SPC-3 PR REGISTER_AND_MOVE: Unable to locate"
" initiator_str from Transport ID\n"); " initiator_str from Transport ID\n");
......
...@@ -1216,9 +1216,11 @@ sbc_execute_unmap(struct se_cmd *cmd) ...@@ -1216,9 +1216,11 @@ sbc_execute_unmap(struct se_cmd *cmd)
goto err; goto err;
} }
if (range) {
ret = ops->execute_unmap(cmd, lba, range); ret = ops->execute_unmap(cmd, lba, range);
if (ret) if (ret)
goto err; goto err;
}
ptr += 16; ptr += 16;
size -= 16; size -= 16;
......
...@@ -1774,6 +1774,9 @@ void transport_generic_request_failure(struct se_cmd *cmd, ...@@ -1774,6 +1774,9 @@ void transport_generic_request_failure(struct se_cmd *cmd,
case TCM_OUT_OF_RESOURCES: case TCM_OUT_OF_RESOURCES:
cmd->scsi_status = SAM_STAT_TASK_SET_FULL; cmd->scsi_status = SAM_STAT_TASK_SET_FULL;
goto queue_status; goto queue_status;
case TCM_LUN_BUSY:
cmd->scsi_status = SAM_STAT_BUSY;
goto queue_status;
case TCM_RESERVATION_CONFLICT: case TCM_RESERVATION_CONFLICT:
/* /*
* No SENSE Data payload for this case, set SCSI Status * No SENSE Data payload for this case, set SCSI Status
......
This diff is collapsed.
...@@ -53,6 +53,7 @@ struct target_backend_ops { ...@@ -53,6 +53,7 @@ struct target_backend_ops {
void (*free_prot)(struct se_device *); void (*free_prot)(struct se_device *);
struct configfs_attribute **tb_dev_attrib_attrs; struct configfs_attribute **tb_dev_attrib_attrs;
struct configfs_attribute **tb_dev_action_attrs;
}; };
struct sbc_ops { struct sbc_ops {
......
...@@ -183,6 +183,7 @@ enum tcm_sense_reason_table { ...@@ -183,6 +183,7 @@ enum tcm_sense_reason_table {
TCM_TOO_MANY_SEGMENT_DESCS = R(0x1b), TCM_TOO_MANY_SEGMENT_DESCS = R(0x1b),
TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE = R(0x1c), TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE = R(0x1c),
TCM_INSUFFICIENT_REGISTRATION_RESOURCES = R(0x1d), TCM_INSUFFICIENT_REGISTRATION_RESOURCES = R(0x1d),
TCM_LUN_BUSY = R(0x1e),
#undef R #undef R
}; };
...@@ -808,6 +809,7 @@ struct se_device { ...@@ -808,6 +809,7 @@ struct se_device {
/* T10 SPC-2 + SPC-3 Reservations */ /* T10 SPC-2 + SPC-3 Reservations */
struct t10_reservation t10_pr; struct t10_reservation t10_pr;
struct se_dev_attrib dev_attrib; struct se_dev_attrib dev_attrib;
struct config_group dev_action_group;
struct config_group dev_group; struct config_group dev_group;
struct config_group dev_pr_group; struct config_group dev_pr_group;
struct se_dev_stat_grps dev_stat_grps; struct se_dev_stat_grps dev_stat_grps;
......
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