scsi: scsi_transport_fc: Introduce encryption group in fc_rport attribute
Introduce a new structure for reporting an encrypted session over an fc_rport. The encryption group is added as an attribute in struct fc_rport and reports information in fc_encryption_info. This structure contains a status member variable, which stores a bit value indicating an encrypted session. Signed-off-by: Sarah Catania <sarah.catania@broadcom.com> Signed-off-by: Justin Tee <justin.tee@broadcom.com> Link: https://patch.msgid.link/20251211001659.138635-2-justintee8345@gmail.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>master
parent
8f0b4cce44
commit
bd2bc52869
|
|
@ -169,6 +169,12 @@ static int transport_add_class_device(struct attribute_container *cont,
|
||||||
goto err_del;
|
goto err_del;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tcont->encryption) {
|
||||||
|
error = sysfs_create_group(&classdev->kobj, tcont->encryption);
|
||||||
|
if (error)
|
||||||
|
goto err_del;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_del:
|
err_del:
|
||||||
|
|
@ -244,6 +250,8 @@ static int transport_remove_classdev(struct attribute_container *cont,
|
||||||
if (tclass->remove != anon_transport_dummy_function) {
|
if (tclass->remove != anon_transport_dummy_function) {
|
||||||
if (tcont->statistics)
|
if (tcont->statistics)
|
||||||
sysfs_remove_group(&classdev->kobj, tcont->statistics);
|
sysfs_remove_group(&classdev->kobj, tcont->statistics);
|
||||||
|
if (tcont->encryption)
|
||||||
|
sysfs_remove_group(&classdev->kobj, tcont->encryption);
|
||||||
attribute_container_class_device_del(classdev);
|
attribute_container_class_device_del(classdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1328,6 +1328,46 @@ store_fc_rport_fast_io_fail_tmo(struct device *dev,
|
||||||
static FC_DEVICE_ATTR(rport, fast_io_fail_tmo, S_IRUGO | S_IWUSR,
|
static FC_DEVICE_ATTR(rport, fast_io_fail_tmo, S_IRUGO | S_IWUSR,
|
||||||
show_fc_rport_fast_io_fail_tmo, store_fc_rport_fast_io_fail_tmo);
|
show_fc_rport_fast_io_fail_tmo, store_fc_rport_fast_io_fail_tmo);
|
||||||
|
|
||||||
|
#define fc_rport_encryption(name) \
|
||||||
|
static ssize_t fc_rport_encinfo_##name(struct device *cd, \
|
||||||
|
struct device_attribute *attr, \
|
||||||
|
char *buf) \
|
||||||
|
{ \
|
||||||
|
struct fc_rport *rport = transport_class_to_rport(cd); \
|
||||||
|
struct Scsi_Host *shost = rport_to_shost(rport); \
|
||||||
|
struct fc_internal *i = to_fc_internal(shost->transportt); \
|
||||||
|
struct fc_encryption_info *info; \
|
||||||
|
ssize_t ret = -ENOENT; \
|
||||||
|
u32 data; \
|
||||||
|
\
|
||||||
|
if (i->f->get_fc_rport_enc_info) { \
|
||||||
|
info = (i->f->get_fc_rport_enc_info)(rport); \
|
||||||
|
if (info) { \
|
||||||
|
data = info->name; \
|
||||||
|
if (!strcmp(#name, "status")) { \
|
||||||
|
ret = scnprintf(buf, \
|
||||||
|
FC_RPORT_ENCRYPTION_STATUS_MAX_LEN, \
|
||||||
|
"%s\n", \
|
||||||
|
data ? "Encrypted" : "Unencrypted"); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
return ret; \
|
||||||
|
} \
|
||||||
|
static FC_DEVICE_ATTR(rport, encryption_##name, 0444, fc_rport_encinfo_##name, NULL) \
|
||||||
|
|
||||||
|
fc_rport_encryption(status);
|
||||||
|
|
||||||
|
static struct attribute *fc_rport_encryption_attrs[] = {
|
||||||
|
&device_attr_rport_encryption_status.attr,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attribute_group fc_rport_encryption_group = {
|
||||||
|
.name = "encryption",
|
||||||
|
.attrs = fc_rport_encryption_attrs,
|
||||||
|
};
|
||||||
|
|
||||||
#define fc_rport_fpin_statistic(name) \
|
#define fc_rport_fpin_statistic(name) \
|
||||||
static ssize_t fc_rport_fpinstat_##name(struct device *cd, \
|
static ssize_t fc_rport_fpinstat_##name(struct device *cd, \
|
||||||
struct device_attribute *attr, \
|
struct device_attribute *attr, \
|
||||||
|
|
@ -2633,6 +2673,8 @@ fc_attach_transport(struct fc_function_template *ft)
|
||||||
i->rport_attr_cont.ac.attrs = &i->rport_attrs[0];
|
i->rport_attr_cont.ac.attrs = &i->rport_attrs[0];
|
||||||
i->rport_attr_cont.ac.class = &fc_rport_class.class;
|
i->rport_attr_cont.ac.class = &fc_rport_class.class;
|
||||||
i->rport_attr_cont.ac.match = fc_rport_match;
|
i->rport_attr_cont.ac.match = fc_rport_match;
|
||||||
|
if (ft->get_fc_rport_enc_info)
|
||||||
|
i->rport_attr_cont.encryption = &fc_rport_encryption_group;
|
||||||
i->rport_attr_cont.statistics = &fc_rport_statistics_group;
|
i->rport_attr_cont.statistics = &fc_rport_statistics_group;
|
||||||
transport_container_register(&i->rport_attr_cont);
|
transport_container_register(&i->rport_attr_cont);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ struct anon_transport_class cls = { \
|
||||||
struct transport_container {
|
struct transport_container {
|
||||||
struct attribute_container ac;
|
struct attribute_container ac;
|
||||||
const struct attribute_group *statistics;
|
const struct attribute_group *statistics;
|
||||||
|
const struct attribute_group *encryption;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define attribute_container_to_transport_container(x) \
|
#define attribute_container_to_transport_container(x) \
|
||||||
|
|
|
||||||
|
|
@ -317,6 +317,15 @@ struct fc_fpin_stats {
|
||||||
u64 cn_device_specific;
|
u64 cn_device_specific;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define FC_RPORT_ENCRYPTION_STATUS_MAX_LEN 14
|
||||||
|
/*
|
||||||
|
* Encryption Information
|
||||||
|
*/
|
||||||
|
struct fc_encryption_info {
|
||||||
|
/* Encryption Status */
|
||||||
|
u8 status;
|
||||||
|
};
|
||||||
|
|
||||||
/* Macro for use in defining Remote Port attributes */
|
/* Macro for use in defining Remote Port attributes */
|
||||||
#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
|
#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
|
||||||
struct device_attribute dev_attr_rport_##_name = \
|
struct device_attribute dev_attr_rport_##_name = \
|
||||||
|
|
@ -364,6 +373,7 @@ struct fc_rport { /* aka fc_starget_attrs */
|
||||||
u64 port_name;
|
u64 port_name;
|
||||||
u32 port_id;
|
u32 port_id;
|
||||||
u32 roles;
|
u32 roles;
|
||||||
|
struct fc_encryption_info enc_info;
|
||||||
enum fc_port_state port_state; /* Will only be ONLINE or UNKNOWN */
|
enum fc_port_state port_state; /* Will only be ONLINE or UNKNOWN */
|
||||||
u32 scsi_target_id;
|
u32 scsi_target_id;
|
||||||
u32 fast_io_fail_tmo;
|
u32 fast_io_fail_tmo;
|
||||||
|
|
@ -691,6 +701,8 @@ struct fc_function_template {
|
||||||
struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
|
struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
|
||||||
void (*reset_fc_host_stats)(struct Scsi_Host *);
|
void (*reset_fc_host_stats)(struct Scsi_Host *);
|
||||||
|
|
||||||
|
struct fc_encryption_info * (*get_fc_rport_enc_info)(struct fc_rport *);
|
||||||
|
|
||||||
int (*issue_fc_host_lip)(struct Scsi_Host *);
|
int (*issue_fc_host_lip)(struct Scsi_Host *);
|
||||||
|
|
||||||
void (*dev_loss_tmo_callbk)(struct fc_rport *);
|
void (*dev_loss_tmo_callbk)(struct fc_rport *);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue