]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: scsi_transport_fc: Introduce encryption group in fc_rport attribute
authorSarah Catania <sarah.catania@broadcom.com>
Thu, 11 Dec 2025 00:16:57 +0000 (16:16 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 17 Dec 2025 02:56:48 +0000 (21:56 -0500)
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>
drivers/base/transport_class.c
drivers/scsi/scsi_transport_fc.c
include/linux/transport_class.h
include/scsi/scsi_transport_fc.h

index 09ee2a1e35bbd3a4bf2f3995262af47df317b5c9..69c6ac2e8263da0230e85e0b6858c19f07ca3456 100644 (file)
@@ -169,6 +169,12 @@ static int transport_add_class_device(struct attribute_container *cont,
                        goto err_del;
        }
 
+       if (tcont->encryption) {
+               error = sysfs_create_group(&classdev->kobj, tcont->encryption);
+               if (error)
+                       goto err_del;
+       }
+
        return 0;
 
 err_del:
@@ -244,6 +250,8 @@ static int transport_remove_classdev(struct attribute_container *cont,
        if (tclass->remove != anon_transport_dummy_function) {
                if (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);
        }
 
index 987befb024084aa97415e9bc930411b45dff330b..b95c46a346fbc07b433319ef743106eef680a5a5 100644 (file)
@@ -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,
        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)                                  \
 static ssize_t fc_rport_fpinstat_##name(struct device *cd,             \
                                  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.class = &fc_rport_class.class;
        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;
        transport_container_register(&i->rport_attr_cont);
 
index 2efc271a96fa6bcaa3ec9506a927b67aa080a36e..a009d66db15a5c156f6d87d152e3bf2ff9471990 100644 (file)
@@ -56,6 +56,7 @@ struct anon_transport_class cls = {                           \
 struct transport_container {
        struct attribute_container ac;
        const struct attribute_group *statistics;
+       const struct attribute_group *encryption;
 };
 
 #define attribute_container_to_transport_container(x) \
index b908aacfef48621ffa6c11a68a5e74ec7fee3529..9f30625aa0d30471219a6954222e7bfa82f858a5 100644 (file)
@@ -317,6 +317,15 @@ struct fc_fpin_stats {
        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 */
 #define FC_RPORT_ATTR(_name,_mode,_show,_store)                                \
 struct device_attribute dev_attr_rport_##_name =       \
@@ -364,6 +373,7 @@ struct fc_rport {   /* aka fc_starget_attrs */
        u64 port_name;
        u32 port_id;
        u32 roles;
+       struct fc_encryption_info enc_info;
        enum fc_port_state port_state;  /* Will only be ONLINE or UNKNOWN */
        u32 scsi_target_id;
        u32 fast_io_fail_tmo;
@@ -691,6 +701,8 @@ struct fc_function_template {
        struct fc_host_statistics * (*get_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 *);
 
        void    (*dev_loss_tmo_callbk)(struct fc_rport *);