Commit fb2b2844 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Nicholas Bellinger

tcm_loop: Implement transport offline

Add attribute 'transport_status' to simulate link failure.
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 1ec59fee
...@@ -178,7 +178,10 @@ static void tcm_loop_submission_work(struct work_struct *work) ...@@ -178,7 +178,10 @@ static void tcm_loop_submission_work(struct work_struct *work)
set_host_byte(sc, DID_NO_CONNECT); set_host_byte(sc, DID_NO_CONNECT);
goto out_done; goto out_done;
} }
if (tl_tpg->tl_transport_status == TCM_TRANSPORT_OFFLINE) {
set_host_byte(sc, DID_TRANSPORT_DISRUPTED);
goto out_done;
}
tl_nexus = tl_hba->tl_nexus; tl_nexus = tl_hba->tl_nexus;
if (!tl_nexus) { if (!tl_nexus) {
scmd_printk(KERN_ERR, sc, "TCM_Loop I_T Nexus" scmd_printk(KERN_ERR, sc, "TCM_Loop I_T Nexus"
...@@ -1064,8 +1067,56 @@ static ssize_t tcm_loop_tpg_store_nexus( ...@@ -1064,8 +1067,56 @@ static ssize_t tcm_loop_tpg_store_nexus(
TF_TPG_BASE_ATTR(tcm_loop, nexus, S_IRUGO | S_IWUSR); TF_TPG_BASE_ATTR(tcm_loop, nexus, S_IRUGO | S_IWUSR);
static ssize_t tcm_loop_tpg_show_transport_status(
struct se_portal_group *se_tpg,
char *page)
{
struct tcm_loop_tpg *tl_tpg = container_of(se_tpg,
struct tcm_loop_tpg, tl_se_tpg);
const char *status = NULL;
ssize_t ret = -EINVAL;
switch (tl_tpg->tl_transport_status) {
case TCM_TRANSPORT_ONLINE:
status = "online";
break;
case TCM_TRANSPORT_OFFLINE:
status = "offline";
break;
default:
break;
}
if (status)
ret = snprintf(page, PAGE_SIZE, "%s\n", status);
return ret;
}
static ssize_t tcm_loop_tpg_store_transport_status(
struct se_portal_group *se_tpg,
const char *page,
size_t count)
{
struct tcm_loop_tpg *tl_tpg = container_of(se_tpg,
struct tcm_loop_tpg, tl_se_tpg);
if (!strncmp(page, "online", 6)) {
tl_tpg->tl_transport_status = TCM_TRANSPORT_ONLINE;
return count;
}
if (!strncmp(page, "offline", 7)) {
tl_tpg->tl_transport_status = TCM_TRANSPORT_OFFLINE;
return count;
}
return -EINVAL;
}
TF_TPG_BASE_ATTR(tcm_loop, transport_status, S_IRUGO | S_IWUSR);
static struct configfs_attribute *tcm_loop_tpg_attrs[] = { static struct configfs_attribute *tcm_loop_tpg_attrs[] = {
&tcm_loop_tpg_nexus.attr, &tcm_loop_tpg_nexus.attr,
&tcm_loop_tpg_transport_status.attr,
NULL, NULL,
}; };
......
...@@ -40,8 +40,12 @@ struct tcm_loop_nacl { ...@@ -40,8 +40,12 @@ struct tcm_loop_nacl {
struct se_node_acl se_node_acl; struct se_node_acl se_node_acl;
}; };
#define TCM_TRANSPORT_ONLINE 0
#define TCM_TRANSPORT_OFFLINE 1
struct tcm_loop_tpg { struct tcm_loop_tpg {
unsigned short tl_tpgt; unsigned short tl_tpgt;
unsigned short tl_transport_status;
atomic_t tl_tpg_port_count; atomic_t tl_tpg_port_count;
struct se_portal_group tl_se_tpg; struct se_portal_group tl_se_tpg;
struct tcm_loop_hba *tl_hba; struct tcm_loop_hba *tl_hba;
......
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