forked from luck/tmp_suning_uos_patched
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 ...
This commit is contained in:
commit
858f45bff3
|
@ -893,6 +893,9 @@ cxgbit_offload_init(struct cxgbit_sock *csk, int iptype, __u8 *peer_ip,
|
|||
return -ENODEV;
|
||||
|
||||
rcu_read_lock();
|
||||
if (!(n->nud_state & NUD_VALID))
|
||||
neigh_event_send(n, NULL);
|
||||
|
||||
ret = -ENOMEM;
|
||||
if (n->dev->flags & IFF_LOOPBACK) {
|
||||
if (iptype == 4)
|
||||
|
|
|
@ -421,7 +421,8 @@ static int chap_server_compute_md5(
|
|||
auth_ret = 0;
|
||||
out:
|
||||
kzfree(desc);
|
||||
crypto_free_shash(tfm);
|
||||
if (tfm)
|
||||
crypto_free_shash(tfm);
|
||||
kfree(challenge);
|
||||
kfree(challenge_binhex);
|
||||
return auth_ret;
|
||||
|
|
|
@ -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)) {
|
||||
write_unlock_bh(&sk->sk_callback_lock);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ static void tcm_loop_release_cmd(struct se_cmd *se_cmd)
|
|||
|
||||
static int tcm_loop_show_info(struct seq_file *m, struct Scsi_Host *host)
|
||||
{
|
||||
seq_printf(m, "tcm_loop_proc_info()\n");
|
||||
seq_puts(m, "tcm_loop_proc_info()\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -123,8 +123,8 @@ static void tcm_loop_submission_work(struct work_struct *work)
|
|||
}
|
||||
tl_nexus = tl_tpg->tl_nexus;
|
||||
if (!tl_nexus) {
|
||||
scmd_printk(KERN_ERR, sc, "TCM_Loop I_T Nexus"
|
||||
" does not exist\n");
|
||||
scmd_printk(KERN_ERR, sc,
|
||||
"TCM_Loop I_T Nexus does not exist\n");
|
||||
set_host_byte(sc, DID_ERROR);
|
||||
goto out_done;
|
||||
}
|
||||
|
@ -166,7 +166,6 @@ static void tcm_loop_submission_work(struct work_struct *work)
|
|||
out_done:
|
||||
kmem_cache_free(tcm_loop_cmd_cache, tl_cmd);
|
||||
sc->scsi_done(sc);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -177,14 +176,13 @@ static int tcm_loop_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *sc)
|
|||
{
|
||||
struct tcm_loop_cmd *tl_cmd;
|
||||
|
||||
pr_debug("tcm_loop_queuecommand() %d:%d:%d:%llu got CDB: 0x%02x"
|
||||
" scsi_buf_len: %u\n", sc->device->host->host_no,
|
||||
sc->device->id, sc->device->channel, sc->device->lun,
|
||||
sc->cmnd[0], scsi_bufflen(sc));
|
||||
pr_debug("%s() %d:%d:%d:%llu got CDB: 0x%02x scsi_buf_len: %u\n",
|
||||
__func__, sc->device->host->host_no, sc->device->id,
|
||||
sc->device->channel, sc->device->lun, sc->cmnd[0],
|
||||
scsi_bufflen(sc));
|
||||
|
||||
tl_cmd = kmem_cache_zalloc(tcm_loop_cmd_cache, GFP_ATOMIC);
|
||||
if (!tl_cmd) {
|
||||
pr_err("Unable to allocate struct tcm_loop_cmd\n");
|
||||
set_host_byte(sc, DID_ERROR);
|
||||
sc->scsi_done(sc);
|
||||
return 0;
|
||||
|
@ -204,10 +202,10 @@ static int tcm_loop_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *sc)
|
|||
static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg,
|
||||
u64 lun, int task, enum tcm_tmreq_table tmr)
|
||||
{
|
||||
struct se_cmd *se_cmd = NULL;
|
||||
struct se_cmd *se_cmd;
|
||||
struct se_session *se_sess;
|
||||
struct tcm_loop_nexus *tl_nexus;
|
||||
struct tcm_loop_cmd *tl_cmd = NULL;
|
||||
struct tcm_loop_cmd *tl_cmd;
|
||||
int ret = TMR_FUNCTION_FAILED, rc;
|
||||
|
||||
/*
|
||||
|
@ -215,16 +213,13 @@ static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg,
|
|||
*/
|
||||
tl_nexus = tl_tpg->tl_nexus;
|
||||
if (!tl_nexus) {
|
||||
pr_err("Unable to perform device reset without"
|
||||
" active I_T Nexus\n");
|
||||
pr_err("Unable to perform device reset without active I_T Nexus\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
tl_cmd = kmem_cache_zalloc(tcm_loop_cmd_cache, GFP_KERNEL);
|
||||
if (!tl_cmd) {
|
||||
pr_err("Unable to allocate memory for tl_cmd\n");
|
||||
if (!tl_cmd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
init_completion(&tl_cmd->tmr_done);
|
||||
|
||||
|
@ -298,8 +293,7 @@ static int tcm_loop_target_reset(struct scsi_cmnd *sc)
|
|||
*/
|
||||
tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host);
|
||||
if (!tl_hba) {
|
||||
pr_err("Unable to perform device reset without"
|
||||
" active I_T Nexus\n");
|
||||
pr_err("Unable to perform device reset without active I_T Nexus\n");
|
||||
return FAILED;
|
||||
}
|
||||
/*
|
||||
|
@ -417,8 +411,7 @@ static int tcm_loop_setup_hba_bus(struct tcm_loop_hba *tl_hba, int tcm_loop_host
|
|||
|
||||
ret = device_register(&tl_hba->dev);
|
||||
if (ret) {
|
||||
pr_err("device_register() failed for"
|
||||
" tl_hba->dev: %d\n", ret);
|
||||
pr_err("device_register() failed for tl_hba->dev: %d\n", ret);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -447,8 +440,7 @@ static int tcm_loop_alloc_core_bus(void)
|
|||
|
||||
ret = driver_register(&tcm_loop_driverfs);
|
||||
if (ret) {
|
||||
pr_err("driver_register() failed for"
|
||||
"tcm_loop_driverfs\n");
|
||||
pr_err("driver_register() failed for tcm_loop_driverfs\n");
|
||||
goto bus_unreg;
|
||||
}
|
||||
|
||||
|
@ -587,8 +579,8 @@ static int tcm_loop_queue_data_in(struct se_cmd *se_cmd)
|
|||
struct tcm_loop_cmd, tl_se_cmd);
|
||||
struct scsi_cmnd *sc = tl_cmd->sc;
|
||||
|
||||
pr_debug("tcm_loop_queue_data_in() called for scsi_cmnd: %p"
|
||||
" cdb: 0x%02x\n", sc, sc->cmnd[0]);
|
||||
pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n",
|
||||
__func__, sc, sc->cmnd[0]);
|
||||
|
||||
sc->result = SAM_STAT_GOOD;
|
||||
set_host_byte(sc, DID_OK);
|
||||
|
@ -605,8 +597,8 @@ static int tcm_loop_queue_status(struct se_cmd *se_cmd)
|
|||
struct tcm_loop_cmd, tl_se_cmd);
|
||||
struct scsi_cmnd *sc = tl_cmd->sc;
|
||||
|
||||
pr_debug("tcm_loop_queue_status() called for scsi_cmnd: %p"
|
||||
" cdb: 0x%02x\n", sc, sc->cmnd[0]);
|
||||
pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n",
|
||||
__func__, sc, sc->cmnd[0]);
|
||||
|
||||
if (se_cmd->sense_buffer &&
|
||||
((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) ||
|
||||
|
@ -691,8 +683,8 @@ static void tcm_loop_port_unlink(
|
|||
sd = scsi_device_lookup(tl_hba->sh, 0, tl_tpg->tl_tpgt,
|
||||
se_lun->unpacked_lun);
|
||||
if (!sd) {
|
||||
pr_err("Unable to locate struct scsi_device for %d:%d:"
|
||||
"%llu\n", 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun);
|
||||
pr_err("Unable to locate struct scsi_device for %d:%d:%llu\n",
|
||||
0, tl_tpg->tl_tpgt, se_lun->unpacked_lun);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
|
@ -772,11 +764,9 @@ static int tcm_loop_make_nexus(
|
|||
return -EEXIST;
|
||||
}
|
||||
|
||||
tl_nexus = kzalloc(sizeof(struct tcm_loop_nexus), GFP_KERNEL);
|
||||
if (!tl_nexus) {
|
||||
pr_err("Unable to allocate struct tcm_loop_nexus\n");
|
||||
tl_nexus = kzalloc(sizeof(*tl_nexus), GFP_KERNEL);
|
||||
if (!tl_nexus)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
tl_nexus->se_sess = target_alloc_session(&tl_tpg->tl_se_tpg, 0, 0,
|
||||
TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS,
|
||||
|
@ -787,9 +777,8 @@ static int tcm_loop_make_nexus(
|
|||
return ret;
|
||||
}
|
||||
|
||||
pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated"
|
||||
" %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba),
|
||||
name);
|
||||
pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated %s Initiator Port: %s\n",
|
||||
tcm_loop_dump_proto_id(tl_hba), name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -808,15 +797,14 @@ static int tcm_loop_drop_nexus(
|
|||
return -ENODEV;
|
||||
|
||||
if (atomic_read(&tpg->tl_tpg_port_count)) {
|
||||
pr_err("Unable to remove TCM_Loop I_T Nexus with"
|
||||
" active TPG port count: %d\n",
|
||||
atomic_read(&tpg->tl_tpg_port_count));
|
||||
pr_err("Unable to remove TCM_Loop I_T Nexus with active TPG port count: %d\n",
|
||||
atomic_read(&tpg->tl_tpg_port_count));
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
pr_debug("TCM_Loop_ConfigFS: Removing I_T Nexus to emulated"
|
||||
" %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tpg->tl_hba),
|
||||
tl_nexus->se_sess->se_node_acl->initiatorname);
|
||||
pr_debug("TCM_Loop_ConfigFS: Removing I_T Nexus to emulated %s Initiator Port: %s\n",
|
||||
tcm_loop_dump_proto_id(tpg->tl_hba),
|
||||
tl_nexus->se_sess->se_node_acl->initiatorname);
|
||||
/*
|
||||
* Release the SCSI I_T Nexus to the emulated Target Port
|
||||
*/
|
||||
|
@ -868,8 +856,8 @@ static ssize_t tcm_loop_tpg_nexus_store(struct config_item *item,
|
|||
* tcm_loop_make_nexus()
|
||||
*/
|
||||
if (strlen(page) >= TL_WWN_ADDR_LEN) {
|
||||
pr_err("Emulated NAA Sas Address: %s, exceeds"
|
||||
" max: %d\n", page, TL_WWN_ADDR_LEN);
|
||||
pr_err("Emulated NAA Sas Address: %s, exceeds max: %d\n",
|
||||
page, TL_WWN_ADDR_LEN);
|
||||
return -EINVAL;
|
||||
}
|
||||
snprintf(&i_port[0], TL_WWN_ADDR_LEN, "%s", page);
|
||||
|
@ -877,9 +865,8 @@ static ssize_t tcm_loop_tpg_nexus_store(struct config_item *item,
|
|||
ptr = strstr(i_port, "naa.");
|
||||
if (ptr) {
|
||||
if (tl_hba->tl_proto_id != SCSI_PROTOCOL_SAS) {
|
||||
pr_err("Passed SAS Initiator Port %s does not"
|
||||
" match target port protoid: %s\n", i_port,
|
||||
tcm_loop_dump_proto_id(tl_hba));
|
||||
pr_err("Passed SAS Initiator Port %s does not match target port protoid: %s\n",
|
||||
i_port, tcm_loop_dump_proto_id(tl_hba));
|
||||
return -EINVAL;
|
||||
}
|
||||
port_ptr = &i_port[0];
|
||||
|
@ -888,9 +875,8 @@ static ssize_t tcm_loop_tpg_nexus_store(struct config_item *item,
|
|||
ptr = strstr(i_port, "fc.");
|
||||
if (ptr) {
|
||||
if (tl_hba->tl_proto_id != SCSI_PROTOCOL_FCP) {
|
||||
pr_err("Passed FCP Initiator Port %s does not"
|
||||
" match target port protoid: %s\n", i_port,
|
||||
tcm_loop_dump_proto_id(tl_hba));
|
||||
pr_err("Passed FCP Initiator Port %s does not match target port protoid: %s\n",
|
||||
i_port, tcm_loop_dump_proto_id(tl_hba));
|
||||
return -EINVAL;
|
||||
}
|
||||
port_ptr = &i_port[3]; /* Skip over "fc." */
|
||||
|
@ -899,16 +885,15 @@ static ssize_t tcm_loop_tpg_nexus_store(struct config_item *item,
|
|||
ptr = strstr(i_port, "iqn.");
|
||||
if (ptr) {
|
||||
if (tl_hba->tl_proto_id != SCSI_PROTOCOL_ISCSI) {
|
||||
pr_err("Passed iSCSI Initiator Port %s does not"
|
||||
" match target port protoid: %s\n", i_port,
|
||||
tcm_loop_dump_proto_id(tl_hba));
|
||||
pr_err("Passed iSCSI Initiator Port %s does not match target port protoid: %s\n",
|
||||
i_port, tcm_loop_dump_proto_id(tl_hba));
|
||||
return -EINVAL;
|
||||
}
|
||||
port_ptr = &i_port[0];
|
||||
goto check_newline;
|
||||
}
|
||||
pr_err("Unable to locate prefix for emulated Initiator Port:"
|
||||
" %s\n", i_port);
|
||||
pr_err("Unable to locate prefix for emulated Initiator Port: %s\n",
|
||||
i_port);
|
||||
return -EINVAL;
|
||||
/*
|
||||
* Clear any trailing newline for the NAA WWN
|
||||
|
@ -1010,16 +995,15 @@ static struct se_portal_group *tcm_loop_make_naa_tpg(
|
|||
unsigned long tpgt;
|
||||
|
||||
if (strstr(name, "tpgt_") != name) {
|
||||
pr_err("Unable to locate \"tpgt_#\" directory"
|
||||
" group\n");
|
||||
pr_err("Unable to locate \"tpgt_#\" directory group\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
if (kstrtoul(name+5, 10, &tpgt))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (tpgt >= TL_TPGS_PER_HBA) {
|
||||
pr_err("Passed tpgt: %lu exceeds TL_TPGS_PER_HBA:"
|
||||
" %u\n", tpgt, TL_TPGS_PER_HBA);
|
||||
pr_err("Passed tpgt: %lu exceeds TL_TPGS_PER_HBA: %u\n",
|
||||
tpgt, TL_TPGS_PER_HBA);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
tl_tpg = &tl_hba->tl_hba_tpgs[tpgt];
|
||||
|
@ -1032,10 +1016,9 @@ static struct se_portal_group *tcm_loop_make_naa_tpg(
|
|||
if (ret < 0)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
pr_debug("TCM_Loop_ConfigFS: Allocated Emulated %s"
|
||||
" Target Port %s,t,0x%04lx\n", tcm_loop_dump_proto_id(tl_hba),
|
||||
config_item_name(&wwn->wwn_group.cg_item), tpgt);
|
||||
|
||||
pr_debug("TCM_Loop_ConfigFS: Allocated Emulated %s Target Port %s,t,0x%04lx\n",
|
||||
tcm_loop_dump_proto_id(tl_hba),
|
||||
config_item_name(&wwn->wwn_group.cg_item), tpgt);
|
||||
return &tl_tpg->tl_se_tpg;
|
||||
}
|
||||
|
||||
|
@ -1062,9 +1045,9 @@ static void tcm_loop_drop_naa_tpg(
|
|||
tl_tpg->tl_hba = NULL;
|
||||
tl_tpg->tl_tpgt = 0;
|
||||
|
||||
pr_debug("TCM_Loop_ConfigFS: Deallocated Emulated %s"
|
||||
" Target Port %s,t,0x%04x\n", tcm_loop_dump_proto_id(tl_hba),
|
||||
config_item_name(&wwn->wwn_group.cg_item), tpgt);
|
||||
pr_debug("TCM_Loop_ConfigFS: Deallocated Emulated %s Target Port %s,t,0x%04x\n",
|
||||
tcm_loop_dump_proto_id(tl_hba),
|
||||
config_item_name(&wwn->wwn_group.cg_item), tpgt);
|
||||
}
|
||||
|
||||
/* End items for tcm_loop_naa_cit */
|
||||
|
@ -1081,11 +1064,10 @@ static struct se_wwn *tcm_loop_make_scsi_hba(
|
|||
char *ptr;
|
||||
int ret, off = 0;
|
||||
|
||||
tl_hba = kzalloc(sizeof(struct tcm_loop_hba), GFP_KERNEL);
|
||||
if (!tl_hba) {
|
||||
pr_err("Unable to allocate struct tcm_loop_hba\n");
|
||||
tl_hba = kzalloc(sizeof(*tl_hba), GFP_KERNEL);
|
||||
if (!tl_hba)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the emulated Protocol Identifier and Target Port Name
|
||||
* based on the incoming configfs directory name.
|
||||
|
@ -1103,8 +1085,8 @@ static struct se_wwn *tcm_loop_make_scsi_hba(
|
|||
}
|
||||
ptr = strstr(name, "iqn.");
|
||||
if (!ptr) {
|
||||
pr_err("Unable to locate prefix for emulated Target "
|
||||
"Port: %s\n", name);
|
||||
pr_err("Unable to locate prefix for emulated Target Port: %s\n",
|
||||
name);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1112,9 +1094,8 @@ static struct se_wwn *tcm_loop_make_scsi_hba(
|
|||
|
||||
check_len:
|
||||
if (strlen(name) >= TL_WWN_ADDR_LEN) {
|
||||
pr_err("Emulated NAA %s Address: %s, exceeds"
|
||||
" max: %d\n", name, tcm_loop_dump_proto_id(tl_hba),
|
||||
TL_WWN_ADDR_LEN);
|
||||
pr_err("Emulated NAA %s Address: %s, exceeds max: %d\n",
|
||||
name, tcm_loop_dump_proto_id(tl_hba), TL_WWN_ADDR_LEN);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1131,10 +1112,8 @@ static struct se_wwn *tcm_loop_make_scsi_hba(
|
|||
|
||||
sh = tl_hba->sh;
|
||||
tcm_loop_hba_no_cnt++;
|
||||
pr_debug("TCM_Loop_ConfigFS: Allocated emulated Target"
|
||||
" %s Address: %s at Linux/SCSI Host ID: %d\n",
|
||||
tcm_loop_dump_proto_id(tl_hba), name, sh->host_no);
|
||||
|
||||
pr_debug("TCM_Loop_ConfigFS: Allocated emulated Target %s Address: %s at Linux/SCSI Host ID: %d\n",
|
||||
tcm_loop_dump_proto_id(tl_hba), name, sh->host_no);
|
||||
return &tl_hba->tl_hba_wwn;
|
||||
out:
|
||||
kfree(tl_hba);
|
||||
|
@ -1147,10 +1126,9 @@ static void tcm_loop_drop_scsi_hba(
|
|||
struct tcm_loop_hba *tl_hba = container_of(wwn,
|
||||
struct tcm_loop_hba, tl_hba_wwn);
|
||||
|
||||
pr_debug("TCM_Loop_ConfigFS: Deallocating emulated Target"
|
||||
" %s Address: %s at Linux/SCSI Host ID: %d\n",
|
||||
tcm_loop_dump_proto_id(tl_hba), tl_hba->tl_wwn_address,
|
||||
tl_hba->sh->host_no);
|
||||
pr_debug("TCM_Loop_ConfigFS: Deallocating emulated Target %s Address: %s at Linux/SCSI Host ID: %d\n",
|
||||
tcm_loop_dump_proto_id(tl_hba), tl_hba->tl_wwn_address,
|
||||
tl_hba->sh->host_no);
|
||||
/*
|
||||
* Call device_unregister() on the original tl_hba->dev.
|
||||
* tcm_loop_fabric_scsi.c:tcm_loop_release_adapter() will
|
||||
|
@ -1223,8 +1201,7 @@ static int __init tcm_loop_fabric_init(void)
|
|||
__alignof__(struct tcm_loop_cmd),
|
||||
0, NULL);
|
||||
if (!tcm_loop_cmd_cache) {
|
||||
pr_debug("kmem_cache_create() for"
|
||||
" tcm_loop_cmd_cache failed\n");
|
||||
pr_debug("kmem_cache_create() for tcm_loop_cmd_cache failed\n");
|
||||
goto out_destroy_workqueue;
|
||||
}
|
||||
|
||||
|
|
|
@ -201,10 +201,9 @@ static struct sbp_session *sbp_session_create(
|
|||
snprintf(guid_str, sizeof(guid_str), "%016llx", guid);
|
||||
|
||||
sess = kmalloc(sizeof(*sess), GFP_KERNEL);
|
||||
if (!sess) {
|
||||
pr_err("failed to allocate session descriptor\n");
|
||||
if (!sess)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
spin_lock_init(&sess->lock);
|
||||
INIT_LIST_HEAD(&sess->login_list);
|
||||
INIT_DELAYED_WORK(&sess->maint_work, session_maintenance_work);
|
||||
|
@ -2029,10 +2028,8 @@ static struct se_portal_group *sbp_make_tpg(
|
|||
}
|
||||
|
||||
tpg = kzalloc(sizeof(*tpg), GFP_KERNEL);
|
||||
if (!tpg) {
|
||||
pr_err("Unable to allocate struct sbp_tpg\n");
|
||||
if (!tpg)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
tpg->tport = tport;
|
||||
tpg->tport_tpgt = tpgt;
|
||||
|
@ -2088,10 +2085,8 @@ static struct se_wwn *sbp_make_tport(
|
|||
return ERR_PTR(-EINVAL);
|
||||
|
||||
tport = kzalloc(sizeof(*tport), GFP_KERNEL);
|
||||
if (!tport) {
|
||||
pr_err("Unable to allocate struct sbp_tport\n");
|
||||
if (!tport)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
tport->guid = guid;
|
||||
sbp_format_wwn(tport->tport_name, SBP_NAMELEN, guid);
|
||||
|
|
|
@ -1197,6 +1197,7 @@ struct configfs_attribute *passthrough_attrib_attrs[] = {
|
|||
EXPORT_SYMBOL(passthrough_attrib_attrs);
|
||||
|
||||
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 */
|
||||
|
||||
|
@ -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_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",
|
||||
&tb->tb_dev_attrib_cit);
|
||||
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 = {
|
|||
void target_setup_backend_cits(struct target_backend *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_pr_cit(tb);
|
||||
target_core_setup_dev_wwn_cit(tb);
|
||||
|
|
|
@ -997,7 +997,7 @@ int target_configure_device(struct se_device *dev)
|
|||
|
||||
ret = core_setup_alua(dev);
|
||||
if (ret)
|
||||
goto out_free_index;
|
||||
goto out_destroy_device;
|
||||
|
||||
/*
|
||||
* Startup the struct se_device processing thread
|
||||
|
@ -1041,6 +1041,8 @@ int target_configure_device(struct se_device *dev)
|
|||
|
||||
out_free_alua:
|
||||
core_alua_free_lu_gp_mem(dev);
|
||||
out_destroy_device:
|
||||
dev->transport->destroy_device(dev);
|
||||
out_free_index:
|
||||
mutex_lock(&device_mutex);
|
||||
idr_remove(&devices_idr, dev->dev_index);
|
||||
|
|
|
@ -273,7 +273,7 @@ static int iscsi_get_pr_transport_id_len(
|
|||
|
||||
static char *iscsi_parse_pr_out_transport_id(
|
||||
struct se_portal_group *se_tpg,
|
||||
const char *buf,
|
||||
char *buf,
|
||||
u32 *out_tid_len,
|
||||
char **port_nexus_ptr)
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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 *buf, u32 *out_tid_len, char **port_nexus_ptr)
|
||||
char *buf, u32 *out_tid_len, char **port_nexus_ptr)
|
||||
{
|
||||
u32 offset;
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ struct target_backend {
|
|||
|
||||
struct config_item_type tb_dev_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_wwn_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,
|
|||
struct t10_pr_registration *pr_reg, int *format_code,
|
||||
unsigned char *buf);
|
||||
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 */
|
||||
struct se_hba *core_alloc_hba(const char *, u32, u32);
|
||||
|
|
|
@ -1601,7 +1601,7 @@ core_scsi3_decode_spec_i_port(
|
|||
dest_rtpi = tmp_lun->lun_rtpi;
|
||||
|
||||
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)
|
||||
continue;
|
||||
|
||||
|
@ -3287,7 +3287,7 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
|
|||
goto out;
|
||||
}
|
||||
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) {
|
||||
pr_err("SPC-3 PR REGISTER_AND_MOVE: Unable to locate"
|
||||
" initiator_str from Transport ID\n");
|
||||
|
|
|
@ -1216,9 +1216,11 @@ sbc_execute_unmap(struct se_cmd *cmd)
|
|||
goto err;
|
||||
}
|
||||
|
||||
ret = ops->execute_unmap(cmd, lba, range);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (range) {
|
||||
ret = ops->execute_unmap(cmd, lba, range);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ptr += 16;
|
||||
size -= 16;
|
||||
|
|
|
@ -1774,6 +1774,9 @@ void transport_generic_request_failure(struct se_cmd *cmd,
|
|||
case TCM_OUT_OF_RESOURCES:
|
||||
cmd->scsi_status = SAM_STAT_TASK_SET_FULL;
|
||||
goto queue_status;
|
||||
case TCM_LUN_BUSY:
|
||||
cmd->scsi_status = SAM_STAT_BUSY;
|
||||
goto queue_status;
|
||||
case TCM_RESERVATION_CONFLICT:
|
||||
/*
|
||||
* No SENSE Data payload for this case, set SCSI Status
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -53,6 +53,7 @@ struct target_backend_ops {
|
|||
void (*free_prot)(struct se_device *);
|
||||
|
||||
struct configfs_attribute **tb_dev_attrib_attrs;
|
||||
struct configfs_attribute **tb_dev_action_attrs;
|
||||
};
|
||||
|
||||
struct sbc_ops {
|
||||
|
|
|
@ -183,6 +183,7 @@ enum tcm_sense_reason_table {
|
|||
TCM_TOO_MANY_SEGMENT_DESCS = R(0x1b),
|
||||
TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE = R(0x1c),
|
||||
TCM_INSUFFICIENT_REGISTRATION_RESOURCES = R(0x1d),
|
||||
TCM_LUN_BUSY = R(0x1e),
|
||||
#undef R
|
||||
};
|
||||
|
||||
|
@ -808,6 +809,7 @@ struct se_device {
|
|||
/* T10 SPC-2 + SPC-3 Reservations */
|
||||
struct t10_reservation t10_pr;
|
||||
struct se_dev_attrib dev_attrib;
|
||||
struct config_group dev_action_group;
|
||||
struct config_group dev_group;
|
||||
struct config_group dev_pr_group;
|
||||
struct se_dev_stat_grps dev_stat_grps;
|
||||
|
|
Loading…
Reference in New Issue
Block a user