iscsi-target: Expose default_erl as TPG attribute
This patch exposes default_erl as a TPG attribute so that it may be set TPG wide in demo-mode, but still allow the existing NodeACL attribute to be overridden on a per initiator basis. Reported-by: Arshad Hussain <arshad.hussain@calsoftinc.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
@@ -1046,6 +1046,11 @@ TPG_ATTR(prod_mode_write_protect, S_IRUGO | S_IWUSR);
|
|||||||
*/
|
*/
|
||||||
DEF_TPG_ATTRIB(demo_mode_discovery);
|
DEF_TPG_ATTRIB(demo_mode_discovery);
|
||||||
TPG_ATTR(demo_mode_discovery, S_IRUGO | S_IWUSR);
|
TPG_ATTR(demo_mode_discovery, S_IRUGO | S_IWUSR);
|
||||||
|
/*
|
||||||
|
* Define iscsi_tpg_attrib_s_default_erl
|
||||||
|
*/
|
||||||
|
DEF_TPG_ATTRIB(default_erl);
|
||||||
|
TPG_ATTR(default_erl, S_IRUGO | S_IWUSR);
|
||||||
|
|
||||||
static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
|
static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
|
||||||
&iscsi_tpg_attrib_authentication.attr,
|
&iscsi_tpg_attrib_authentication.attr,
|
||||||
@@ -1057,6 +1062,7 @@ static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
|
|||||||
&iscsi_tpg_attrib_demo_mode_write_protect.attr,
|
&iscsi_tpg_attrib_demo_mode_write_protect.attr,
|
||||||
&iscsi_tpg_attrib_prod_mode_write_protect.attr,
|
&iscsi_tpg_attrib_prod_mode_write_protect.attr,
|
||||||
&iscsi_tpg_attrib_demo_mode_discovery.attr,
|
&iscsi_tpg_attrib_demo_mode_discovery.attr,
|
||||||
|
&iscsi_tpg_attrib_default_erl.attr,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1919,9 +1925,12 @@ static void lio_set_default_node_attributes(struct se_node_acl *se_acl)
|
|||||||
{
|
{
|
||||||
struct iscsi_node_acl *acl = container_of(se_acl, struct iscsi_node_acl,
|
struct iscsi_node_acl *acl = container_of(se_acl, struct iscsi_node_acl,
|
||||||
se_node_acl);
|
se_node_acl);
|
||||||
|
struct se_portal_group *se_tpg = se_acl->se_tpg;
|
||||||
|
struct iscsi_portal_group *tpg = container_of(se_tpg,
|
||||||
|
struct iscsi_portal_group, tpg_se_tpg);
|
||||||
|
|
||||||
acl->node_attrib.nacl = acl;
|
acl->node_attrib.nacl = acl;
|
||||||
iscsit_set_default_node_attribues(acl);
|
iscsit_set_default_node_attribues(acl, tpg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lio_check_stop_free(struct se_cmd *se_cmd)
|
static int lio_check_stop_free(struct se_cmd *se_cmd)
|
||||||
|
@@ -37,9 +37,6 @@
|
|||||||
#define NA_RANDOM_DATAIN_PDU_OFFSETS 0
|
#define NA_RANDOM_DATAIN_PDU_OFFSETS 0
|
||||||
#define NA_RANDOM_DATAIN_SEQ_OFFSETS 0
|
#define NA_RANDOM_DATAIN_SEQ_OFFSETS 0
|
||||||
#define NA_RANDOM_R2T_OFFSETS 0
|
#define NA_RANDOM_R2T_OFFSETS 0
|
||||||
#define NA_DEFAULT_ERL 0
|
|
||||||
#define NA_DEFAULT_ERL_MAX 2
|
|
||||||
#define NA_DEFAULT_ERL_MIN 0
|
|
||||||
|
|
||||||
/* struct iscsi_tpg_attrib sanity values */
|
/* struct iscsi_tpg_attrib sanity values */
|
||||||
#define TA_AUTHENTICATION 1
|
#define TA_AUTHENTICATION 1
|
||||||
@@ -59,6 +56,7 @@
|
|||||||
/* Disabled by default in production mode w/ explict ACLs */
|
/* Disabled by default in production mode w/ explict ACLs */
|
||||||
#define TA_PROD_MODE_WRITE_PROTECT 0
|
#define TA_PROD_MODE_WRITE_PROTECT 0
|
||||||
#define TA_DEMO_MODE_DISCOVERY 1
|
#define TA_DEMO_MODE_DISCOVERY 1
|
||||||
|
#define TA_DEFAULT_ERL 0
|
||||||
#define TA_CACHE_CORE_NPS 0
|
#define TA_CACHE_CORE_NPS 0
|
||||||
|
|
||||||
|
|
||||||
@@ -766,6 +764,7 @@ struct iscsi_tpg_attrib {
|
|||||||
u32 demo_mode_write_protect;
|
u32 demo_mode_write_protect;
|
||||||
u32 prod_mode_write_protect;
|
u32 prod_mode_write_protect;
|
||||||
u32 demo_mode_discovery;
|
u32 demo_mode_discovery;
|
||||||
|
u32 default_erl;
|
||||||
struct iscsi_portal_group *tpg;
|
struct iscsi_portal_group *tpg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -33,7 +33,8 @@ static inline char *iscsit_na_get_initiatorname(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void iscsit_set_default_node_attribues(
|
void iscsit_set_default_node_attribues(
|
||||||
struct iscsi_node_acl *acl)
|
struct iscsi_node_acl *acl,
|
||||||
|
struct iscsi_portal_group *tpg)
|
||||||
{
|
{
|
||||||
struct iscsi_node_attrib *a = &acl->node_attrib;
|
struct iscsi_node_attrib *a = &acl->node_attrib;
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ void iscsit_set_default_node_attribues(
|
|||||||
a->random_datain_pdu_offsets = NA_RANDOM_DATAIN_PDU_OFFSETS;
|
a->random_datain_pdu_offsets = NA_RANDOM_DATAIN_PDU_OFFSETS;
|
||||||
a->random_datain_seq_offsets = NA_RANDOM_DATAIN_SEQ_OFFSETS;
|
a->random_datain_seq_offsets = NA_RANDOM_DATAIN_SEQ_OFFSETS;
|
||||||
a->random_r2t_offsets = NA_RANDOM_R2T_OFFSETS;
|
a->random_r2t_offsets = NA_RANDOM_R2T_OFFSETS;
|
||||||
a->default_erl = NA_DEFAULT_ERL;
|
a->default_erl = tpg->tpg_attrib.default_erl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iscsit_na_dataout_timeout(
|
int iscsit_na_dataout_timeout(
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
#ifndef ISCSI_TARGET_NODEATTRIB_H
|
#ifndef ISCSI_TARGET_NODEATTRIB_H
|
||||||
#define ISCSI_TARGET_NODEATTRIB_H
|
#define ISCSI_TARGET_NODEATTRIB_H
|
||||||
|
|
||||||
extern void iscsit_set_default_node_attribues(struct iscsi_node_acl *);
|
extern void iscsit_set_default_node_attribues(struct iscsi_node_acl *,
|
||||||
|
struct iscsi_portal_group *);
|
||||||
extern int iscsit_na_dataout_timeout(struct iscsi_node_acl *, u32);
|
extern int iscsit_na_dataout_timeout(struct iscsi_node_acl *, u32);
|
||||||
extern int iscsit_na_dataout_timeout_retries(struct iscsi_node_acl *, u32);
|
extern int iscsit_na_dataout_timeout_retries(struct iscsi_node_acl *, u32);
|
||||||
extern int iscsit_na_nopin_timeout(struct iscsi_node_acl *, u32);
|
extern int iscsit_na_nopin_timeout(struct iscsi_node_acl *, u32);
|
||||||
|
@@ -224,6 +224,7 @@ static void iscsit_set_default_tpg_attribs(struct iscsi_portal_group *tpg)
|
|||||||
a->demo_mode_write_protect = TA_DEMO_MODE_WRITE_PROTECT;
|
a->demo_mode_write_protect = TA_DEMO_MODE_WRITE_PROTECT;
|
||||||
a->prod_mode_write_protect = TA_PROD_MODE_WRITE_PROTECT;
|
a->prod_mode_write_protect = TA_PROD_MODE_WRITE_PROTECT;
|
||||||
a->demo_mode_discovery = TA_DEMO_MODE_DISCOVERY;
|
a->demo_mode_discovery = TA_DEMO_MODE_DISCOVERY;
|
||||||
|
a->default_erl = TA_DEFAULT_ERL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct iscsi_portal_group *tpg)
|
int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct iscsi_portal_group *tpg)
|
||||||
@@ -840,3 +841,20 @@ int iscsit_ta_demo_mode_discovery(
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iscsit_ta_default_erl(
|
||||||
|
struct iscsi_portal_group *tpg,
|
||||||
|
u32 default_erl)
|
||||||
|
{
|
||||||
|
struct iscsi_tpg_attrib *a = &tpg->tpg_attrib;
|
||||||
|
|
||||||
|
if ((default_erl != 0) && (default_erl != 1) && (default_erl != 2)) {
|
||||||
|
pr_err("Illegal value for default_erl: %u\n", default_erl);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
a->default_erl = default_erl;
|
||||||
|
pr_debug("iSCSI_TPG[%hu] - DefaultERL: %u\n", tpg->tpgt, a->default_erl);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -38,5 +38,6 @@ extern int iscsit_ta_cache_dynamic_acls(struct iscsi_portal_group *, u32);
|
|||||||
extern int iscsit_ta_demo_mode_write_protect(struct iscsi_portal_group *, u32);
|
extern int iscsit_ta_demo_mode_write_protect(struct iscsi_portal_group *, u32);
|
||||||
extern int iscsit_ta_prod_mode_write_protect(struct iscsi_portal_group *, u32);
|
extern int iscsit_ta_prod_mode_write_protect(struct iscsi_portal_group *, u32);
|
||||||
extern int iscsit_ta_demo_mode_discovery(struct iscsi_portal_group *, u32);
|
extern int iscsit_ta_demo_mode_discovery(struct iscsi_portal_group *, u32);
|
||||||
|
extern int iscsit_ta_default_erl(struct iscsi_portal_group *, u32);
|
||||||
|
|
||||||
#endif /* ISCSI_TARGET_TPG_H */
|
#endif /* ISCSI_TARGET_TPG_H */
|
||||||
|
Reference in New Issue
Block a user