diff --git a/libnvme/libnvme/nvme-swig-accessors.i b/libnvme/libnvme/nvme-swig-accessors.i index 74c07b70fd..7aba161e3c 100644 --- a/libnvme/libnvme/nvme-swig-accessors.i +++ b/libnvme/libnvme/nvme-swig-accessors.i @@ -66,26 +66,31 @@ #define libnvme_path_grpid_set libnvme_path_set_grpid /* struct libnvme_ns */ - #define libnvme_ns_nsid_get libnvme_ns_get_nsid - #define libnvme_ns_name_get libnvme_ns_get_name - #define libnvme_ns_sysfs_dir_get libnvme_ns_get_sysfs_dir - #define libnvme_ns_lba_shift_get libnvme_ns_get_lba_shift - #define libnvme_ns_lba_size_get libnvme_ns_get_lba_size - #define libnvme_ns_meta_size_get libnvme_ns_get_meta_size - #define libnvme_ns_lba_count_get libnvme_ns_get_lba_count - #define libnvme_ns_lba_util_get libnvme_ns_get_lba_util - #define libnvme_ns_nsid_set libnvme_ns_set_nsid - #define libnvme_ns_name_set libnvme_ns_set_name - #define libnvme_ns_sysfs_dir_set libnvme_ns_set_sysfs_dir - #define libnvme_ns_lba_shift_set libnvme_ns_set_lba_shift - #define libnvme_ns_lba_size_set libnvme_ns_set_lba_size - #define libnvme_ns_meta_size_set libnvme_ns_set_meta_size - #define libnvme_ns_lba_count_set libnvme_ns_set_lba_count - #define libnvme_ns_lba_util_set libnvme_ns_set_lba_util + #define libnvme_ns_nsid_get libnvme_ns_get_nsid + #define libnvme_ns_name_get libnvme_ns_get_name + #define libnvme_ns_generic_name_get libnvme_ns_get_generic_name + #define libnvme_ns_sysfs_dir_get libnvme_ns_get_sysfs_dir + #define libnvme_ns_lba_shift_get libnvme_ns_get_lba_shift + #define libnvme_ns_lba_size_get libnvme_ns_get_lba_size + #define libnvme_ns_meta_size_get libnvme_ns_get_meta_size + #define libnvme_ns_lba_count_get libnvme_ns_get_lba_count + #define libnvme_ns_lba_util_get libnvme_ns_get_lba_util + #define libnvme_ns_eui64_get libnvme_ns_get_eui64 + #define libnvme_ns_nguid_get libnvme_ns_get_nguid + #define libnvme_ns_csi_get libnvme_ns_get_csi + #define libnvme_ns_nsid_set libnvme_ns_set_nsid + #define libnvme_ns_name_set libnvme_ns_set_name + #define libnvme_ns_sysfs_dir_set libnvme_ns_set_sysfs_dir + #define libnvme_ns_lba_shift_set libnvme_ns_set_lba_shift + #define libnvme_ns_lba_size_set libnvme_ns_set_lba_size + #define libnvme_ns_meta_size_set libnvme_ns_set_meta_size + #define libnvme_ns_lba_count_set libnvme_ns_set_lba_count + #define libnvme_ns_lba_util_set libnvme_ns_set_lba_util /* struct libnvme_ctrl */ #define libnvme_ctrl_name_get libnvme_ctrl_get_name #define libnvme_ctrl_sysfs_dir_get libnvme_ctrl_get_sysfs_dir + #define libnvme_ctrl_address_get libnvme_ctrl_get_address #define libnvme_ctrl_firmware_get libnvme_ctrl_get_firmware #define libnvme_ctrl_model_get libnvme_ctrl_get_model #define libnvme_ctrl_numa_node_get libnvme_ctrl_get_numa_node @@ -133,14 +138,12 @@ #define libnvme_subsystem_application_set libnvme_subsystem_set_application /* struct libnvme_host */ - #define libnvme_host_hostnqn_get libnvme_host_get_hostnqn - #define libnvme_host_hostid_get libnvme_host_get_hostid - #define libnvme_host_dhchap_host_key_get libnvme_host_get_dhchap_host_key - #define libnvme_host_hostsymname_get libnvme_host_get_hostsymname - #define libnvme_host_pdc_enabled_valid_get libnvme_host_get_pdc_enabled_valid - #define libnvme_host_dhchap_host_key_set libnvme_host_set_dhchap_host_key - #define libnvme_host_hostsymname_set libnvme_host_set_hostsymname - #define libnvme_host_pdc_enabled_valid_set libnvme_host_set_pdc_enabled_valid + #define libnvme_host_hostnqn_get libnvme_host_get_hostnqn + #define libnvme_host_hostid_get libnvme_host_get_hostid + #define libnvme_host_dhchap_host_key_get libnvme_host_get_dhchap_host_key + #define libnvme_host_hostsymname_get libnvme_host_get_hostsymname + #define libnvme_host_dhchap_host_key_set libnvme_host_set_dhchap_host_key + #define libnvme_host_hostsymname_set libnvme_host_set_hostsymname /* struct libnvme_fabric_options */ #define libnvme_fabric_options_cntlid_get libnvme_fabric_options_get_cntlid diff --git a/libnvme/libnvme/nvme.i b/libnvme/libnvme/nvme.i index 76a99101e1..a0c9a284bc 100644 --- a/libnvme/libnvme/nvme.i +++ b/libnvme/libnvme/nvme.i @@ -54,7 +54,7 @@ static inline PyObject *Py_NewRef(PyObject *obj) * "struct_member_[set|get]" and libnvme's API naming convention * "struct_[set|get]_member. */ - #define libnvme_ctrl_address_get libnvme_ctrl_get_traddr + #define libnvme_ctrl_address_get libnvme_ctrl_get_address #define libnvme_ctrl_command_error_count_get libnvme_ctrl_get_command_error_count #define libnvme_ctrl_reconnect_count_get libnvme_ctrl_get_reconnect_count #define libnvme_ctrl_reset_count_get libnvme_ctrl_get_reset_count diff --git a/libnvme/src/accessors.ld b/libnvme/src/accessors.ld index e23d9d7a2b..cc61e38924 100644 --- a/libnvme/src/accessors.ld +++ b/libnvme/src/accessors.ld @@ -1,6 +1,6 @@ # SPDX-License-Identifier: LGPL-2.1-or-later -/** +/* * This file is part of libnvme. * * Copyright (c) 2025, Dell Technologies Inc. or its subsidiaries. @@ -10,175 +10,178 @@ LIBNVME_ACCESSORS_3 { global: - libnvme_ctrl_get_cntlid; - libnvme_ctrl_get_cntrltype; - libnvme_ctrl_get_dctype; - libnvme_ctrl_get_dhchap_ctrl_key; - libnvme_ctrl_get_dhchap_host_key; - libnvme_ctrl_get_discovered; - libnvme_ctrl_get_discovery_ctrl; + libnvme_fabrics_config_get_queue_size; + libnvme_fabrics_config_set_queue_size; + libnvme_fabrics_config_get_nr_io_queues; + libnvme_fabrics_config_set_nr_io_queues; + libnvme_fabrics_config_get_reconnect_delay; + libnvme_fabrics_config_set_reconnect_delay; + libnvme_fabrics_config_get_ctrl_loss_tmo; + libnvme_fabrics_config_set_ctrl_loss_tmo; + libnvme_fabrics_config_get_fast_io_fail_tmo; + libnvme_fabrics_config_set_fast_io_fail_tmo; + libnvme_fabrics_config_get_keep_alive_tmo; + libnvme_fabrics_config_set_keep_alive_tmo; + libnvme_fabrics_config_get_nr_write_queues; + libnvme_fabrics_config_set_nr_write_queues; + libnvme_fabrics_config_get_nr_poll_queues; + libnvme_fabrics_config_set_nr_poll_queues; + libnvme_fabrics_config_get_tos; + libnvme_fabrics_config_set_tos; + libnvme_fabrics_config_get_keyring_id; + libnvme_fabrics_config_set_keyring_id; + libnvme_fabrics_config_get_tls_key_id; + libnvme_fabrics_config_set_tls_key_id; + libnvme_fabrics_config_get_tls_configured_key_id; + libnvme_fabrics_config_set_tls_configured_key_id; + libnvme_fabrics_config_get_duplicate_connect; + libnvme_fabrics_config_set_duplicate_connect; + libnvme_fabrics_config_get_disable_sqflow; + libnvme_fabrics_config_set_disable_sqflow; + libnvme_fabrics_config_get_hdr_digest; + libnvme_fabrics_config_set_hdr_digest; + libnvme_fabrics_config_get_data_digest; + libnvme_fabrics_config_set_data_digest; + libnvme_fabrics_config_get_tls; + libnvme_fabrics_config_set_tls; + libnvme_fabrics_config_get_concat; + libnvme_fabrics_config_set_concat; + libnvme_path_get_name; + libnvme_path_set_name; + libnvme_path_get_sysfs_dir; + libnvme_path_set_sysfs_dir; + libnvme_path_get_grpid; + libnvme_path_set_grpid; + libnvme_ns_get_nsid; + libnvme_ns_set_nsid; + libnvme_ns_get_name; + libnvme_ns_set_name; + libnvme_ns_get_generic_name; + libnvme_ns_get_sysfs_dir; + libnvme_ns_set_sysfs_dir; + libnvme_ns_get_lba_shift; + libnvme_ns_set_lba_shift; + libnvme_ns_get_lba_size; + libnvme_ns_set_lba_size; + libnvme_ns_get_meta_size; + libnvme_ns_set_meta_size; + libnvme_ns_get_lba_count; + libnvme_ns_set_lba_count; + libnvme_ns_get_lba_util; + libnvme_ns_set_lba_util; + libnvme_ns_get_eui64; + libnvme_ns_get_nguid; + libnvme_ns_get_csi; + libnvme_ctrl_get_name; + libnvme_ctrl_get_sysfs_dir; + libnvme_ctrl_get_address; libnvme_ctrl_get_firmware; - libnvme_ctrl_get_host_iface; - libnvme_ctrl_get_host_traddr; - libnvme_ctrl_get_keyring; libnvme_ctrl_get_model; - libnvme_ctrl_get_name; libnvme_ctrl_get_numa_node; - libnvme_ctrl_get_persistent; - libnvme_ctrl_get_phy_slot; libnvme_ctrl_get_queue_count; libnvme_ctrl_get_serial; libnvme_ctrl_get_sqsize; + libnvme_ctrl_get_transport; libnvme_ctrl_get_subsysnqn; - libnvme_ctrl_get_sysfs_dir; - libnvme_ctrl_get_tls_key; - libnvme_ctrl_get_tls_key_identity; libnvme_ctrl_get_traddr; - libnvme_ctrl_get_transport; libnvme_ctrl_get_trsvcid; - libnvme_ctrl_get_unique_discovery_ctrl; - libnvme_ctrl_set_dhchap_ctrl_key; + libnvme_ctrl_get_dhchap_host_key; libnvme_ctrl_set_dhchap_host_key; - libnvme_ctrl_set_discovered; - libnvme_ctrl_set_discovery_ctrl; + libnvme_ctrl_get_dhchap_ctrl_key; + libnvme_ctrl_set_dhchap_ctrl_key; + libnvme_ctrl_get_keyring; libnvme_ctrl_set_keyring; - libnvme_ctrl_set_persistent; - libnvme_ctrl_set_tls_key; + libnvme_ctrl_get_tls_key_identity; libnvme_ctrl_set_tls_key_identity; + libnvme_ctrl_get_tls_key; + libnvme_ctrl_set_tls_key; + libnvme_ctrl_get_cntrltype; + libnvme_ctrl_get_cntlid; + libnvme_ctrl_get_dctype; + libnvme_ctrl_get_phy_slot; + libnvme_ctrl_get_host_traddr; + libnvme_ctrl_get_host_iface; + libnvme_ctrl_get_discovery_ctrl; + libnvme_ctrl_set_discovery_ctrl; + libnvme_ctrl_get_unique_discovery_ctrl; libnvme_ctrl_set_unique_discovery_ctrl; + libnvme_ctrl_get_discovered; + libnvme_ctrl_set_discovered; + libnvme_ctrl_get_persistent; + libnvme_ctrl_set_persistent; + libnvme_subsystem_get_name; + libnvme_subsystem_get_sysfs_dir; + libnvme_subsystem_get_subsysnqn; + libnvme_subsystem_get_model; + libnvme_subsystem_get_serial; + libnvme_subsystem_get_firmware; + libnvme_subsystem_get_subsystype; + libnvme_subsystem_get_application; + libnvme_subsystem_set_application; + libnvme_host_get_hostnqn; + libnvme_host_get_hostid; + libnvme_host_get_dhchap_host_key; + libnvme_host_set_dhchap_host_key; + libnvme_host_get_hostsymname; + libnvme_host_set_hostsymname; libnvme_fabric_options_get_cntlid; - libnvme_fabric_options_get_concat; - libnvme_fabric_options_get_ctrl_loss_tmo; - libnvme_fabric_options_get_data_digest; - libnvme_fabric_options_get_dhchap_ctrl_secret; - libnvme_fabric_options_get_dhchap_secret; - libnvme_fabric_options_get_disable_sqflow; - libnvme_fabric_options_get_discovery; - libnvme_fabric_options_get_duplicate_connect; - libnvme_fabric_options_get_fast_io_fail_tmo; - libnvme_fabric_options_get_hdr_digest; - libnvme_fabric_options_get_host_iface; - libnvme_fabric_options_get_host_traddr; - libnvme_fabric_options_get_hostid; - libnvme_fabric_options_get_hostnqn; - libnvme_fabric_options_get_instance; - libnvme_fabric_options_get_keep_alive_tmo; - libnvme_fabric_options_get_keyring; - libnvme_fabric_options_get_nqn; - libnvme_fabric_options_get_nr_io_queues; - libnvme_fabric_options_get_nr_poll_queues; - libnvme_fabric_options_get_nr_write_queues; - libnvme_fabric_options_get_queue_size; - libnvme_fabric_options_get_reconnect_delay; - libnvme_fabric_options_get_tls; - libnvme_fabric_options_get_tls_key; - libnvme_fabric_options_get_tos; - libnvme_fabric_options_get_traddr; - libnvme_fabric_options_get_transport; - libnvme_fabric_options_get_trsvcid; libnvme_fabric_options_set_cntlid; + libnvme_fabric_options_get_concat; libnvme_fabric_options_set_concat; + libnvme_fabric_options_get_ctrl_loss_tmo; libnvme_fabric_options_set_ctrl_loss_tmo; + libnvme_fabric_options_get_data_digest; libnvme_fabric_options_set_data_digest; + libnvme_fabric_options_get_dhchap_ctrl_secret; libnvme_fabric_options_set_dhchap_ctrl_secret; + libnvme_fabric_options_get_dhchap_secret; libnvme_fabric_options_set_dhchap_secret; + libnvme_fabric_options_get_disable_sqflow; libnvme_fabric_options_set_disable_sqflow; + libnvme_fabric_options_get_discovery; libnvme_fabric_options_set_discovery; + libnvme_fabric_options_get_duplicate_connect; libnvme_fabric_options_set_duplicate_connect; + libnvme_fabric_options_get_fast_io_fail_tmo; libnvme_fabric_options_set_fast_io_fail_tmo; + libnvme_fabric_options_get_hdr_digest; libnvme_fabric_options_set_hdr_digest; + libnvme_fabric_options_get_host_iface; libnvme_fabric_options_set_host_iface; + libnvme_fabric_options_get_host_traddr; libnvme_fabric_options_set_host_traddr; + libnvme_fabric_options_get_hostid; libnvme_fabric_options_set_hostid; + libnvme_fabric_options_get_hostnqn; libnvme_fabric_options_set_hostnqn; + libnvme_fabric_options_get_instance; libnvme_fabric_options_set_instance; + libnvme_fabric_options_get_keep_alive_tmo; libnvme_fabric_options_set_keep_alive_tmo; + libnvme_fabric_options_get_keyring; libnvme_fabric_options_set_keyring; + libnvme_fabric_options_get_nqn; libnvme_fabric_options_set_nqn; + libnvme_fabric_options_get_nr_io_queues; libnvme_fabric_options_set_nr_io_queues; + libnvme_fabric_options_get_nr_poll_queues; libnvme_fabric_options_set_nr_poll_queues; + libnvme_fabric_options_get_nr_write_queues; libnvme_fabric_options_set_nr_write_queues; + libnvme_fabric_options_get_queue_size; libnvme_fabric_options_set_queue_size; + libnvme_fabric_options_get_reconnect_delay; libnvme_fabric_options_set_reconnect_delay; + libnvme_fabric_options_get_tls; libnvme_fabric_options_set_tls; + libnvme_fabric_options_get_tls_key; libnvme_fabric_options_set_tls_key; + libnvme_fabric_options_get_tos; libnvme_fabric_options_set_tos; + libnvme_fabric_options_get_traddr; libnvme_fabric_options_set_traddr; + libnvme_fabric_options_get_transport; libnvme_fabric_options_set_transport; + libnvme_fabric_options_get_trsvcid; libnvme_fabric_options_set_trsvcid; - libnvme_fabrics_config_get_concat; - libnvme_fabrics_config_get_ctrl_loss_tmo; - libnvme_fabrics_config_get_data_digest; - libnvme_fabrics_config_get_disable_sqflow; - libnvme_fabrics_config_get_duplicate_connect; - libnvme_fabrics_config_get_fast_io_fail_tmo; - libnvme_fabrics_config_get_hdr_digest; - libnvme_fabrics_config_get_keep_alive_tmo; - libnvme_fabrics_config_get_keyring_id; - libnvme_fabrics_config_get_nr_io_queues; - libnvme_fabrics_config_get_nr_poll_queues; - libnvme_fabrics_config_get_nr_write_queues; - libnvme_fabrics_config_get_queue_size; - libnvme_fabrics_config_get_reconnect_delay; - libnvme_fabrics_config_get_tls; - libnvme_fabrics_config_get_tls_configured_key_id; - libnvme_fabrics_config_get_tls_key_id; - libnvme_fabrics_config_get_tos; - libnvme_fabrics_config_set_concat; - libnvme_fabrics_config_set_ctrl_loss_tmo; - libnvme_fabrics_config_set_data_digest; - libnvme_fabrics_config_set_disable_sqflow; - libnvme_fabrics_config_set_duplicate_connect; - libnvme_fabrics_config_set_fast_io_fail_tmo; - libnvme_fabrics_config_set_hdr_digest; - libnvme_fabrics_config_set_keep_alive_tmo; - libnvme_fabrics_config_set_keyring_id; - libnvme_fabrics_config_set_nr_io_queues; - libnvme_fabrics_config_set_nr_poll_queues; - libnvme_fabrics_config_set_nr_write_queues; - libnvme_fabrics_config_set_queue_size; - libnvme_fabrics_config_set_reconnect_delay; - libnvme_fabrics_config_set_tls; - libnvme_fabrics_config_set_tls_configured_key_id; - libnvme_fabrics_config_set_tls_key_id; - libnvme_fabrics_config_set_tos; - libnvme_host_get_dhchap_host_key; - libnvme_host_get_hostid; - libnvme_host_get_hostnqn; - libnvme_host_get_hostsymname; - libnvme_host_get_pdc_enabled_valid; - libnvme_host_set_dhchap_host_key; - libnvme_host_set_hostsymname; - libnvme_host_set_pdc_enabled_valid; - libnvme_ns_get_lba_count; - libnvme_ns_get_lba_shift; - libnvme_ns_get_lba_size; - libnvme_ns_get_lba_util; - libnvme_ns_get_meta_size; - libnvme_ns_get_name; - libnvme_ns_get_nsid; - libnvme_ns_get_sysfs_dir; - libnvme_ns_set_lba_count; - libnvme_ns_set_lba_shift; - libnvme_ns_set_lba_size; - libnvme_ns_set_lba_util; - libnvme_ns_set_meta_size; - libnvme_ns_set_name; - libnvme_ns_set_nsid; - libnvme_ns_set_sysfs_dir; - libnvme_path_get_grpid; - libnvme_path_get_name; - libnvme_path_get_sysfs_dir; - libnvme_path_set_grpid; - libnvme_path_set_name; - libnvme_path_set_sysfs_dir; - libnvme_subsystem_get_application; - libnvme_subsystem_get_firmware; - libnvme_subsystem_get_model; - libnvme_subsystem_get_name; - libnvme_subsystem_get_serial; - libnvme_subsystem_get_subsysnqn; - libnvme_subsystem_get_subsystype; - libnvme_subsystem_get_sysfs_dir; - libnvme_subsystem_set_application; }; diff --git a/libnvme/src/libnvme.ld b/libnvme/src/libnvme.ld index 08523d0421..172678434c 100644 --- a/libnvme/src/libnvme.ld +++ b/libnvme/src/libnvme.ld @@ -131,7 +131,7 @@ LIBNVME_3 { libnvme_ns_get_nguid; libnvme_ns_get_serial; libnvme_ns_get_subsystem; - libnvme_ns_get_uuid; + libnvme_ns_copy_uuid; libnvme_ns_reset_stat; libnvme_ns_update_stat; libnvme_ns_get_stat_interval; diff --git a/libnvme/src/nvme/accessors-fabrics.h b/libnvme/src/nvme/accessors-fabrics.h index 027435a635..e2c23fde69 100644 --- a/libnvme/src/nvme/accessors-fabrics.h +++ b/libnvme/src/nvme/accessors-fabrics.h @@ -26,6 +26,7 @@ #include #include +#include /* Forward declarations. These are internal (opaque) structs. */ struct libnvmf_discovery_args; diff --git a/libnvme/src/nvme/accessors.c b/libnvme/src/nvme/accessors.c index a2729014df..66c9a12fcf 100644 --- a/libnvme/src/nvme/accessors.c +++ b/libnvme/src/nvme/accessors.c @@ -326,6 +326,11 @@ __public const char *libnvme_ns_get_name(const struct libnvme_ns *p) return p->name; } +__public const char *libnvme_ns_get_generic_name(const struct libnvme_ns *p) +{ + return p->generic_name; +} + __public void libnvme_ns_set_sysfs_dir( struct libnvme_ns *p, const char *sysfs_dir) @@ -389,6 +394,21 @@ __public uint64_t libnvme_ns_get_lba_util(const struct libnvme_ns *p) return p->lba_util; } +__public const uint8_t *libnvme_ns_get_eui64(const struct libnvme_ns *p) +{ + return p->eui64; +} + +__public const uint8_t *libnvme_ns_get_nguid(const struct libnvme_ns *p) +{ + return p->nguid; +} + +__public enum nvme_csi libnvme_ns_get_csi(const struct libnvme_ns *p) +{ + return p->csi; +} + /**************************************************************************** * Accessors for: struct libnvme_ctrl ****************************************************************************/ @@ -403,6 +423,11 @@ __public const char *libnvme_ctrl_get_sysfs_dir(const struct libnvme_ctrl *p) return p->sysfs_dir; } +__public const char *libnvme_ctrl_get_address(const struct libnvme_ctrl *p) +{ + return p->address; +} + __public const char *libnvme_ctrl_get_firmware(const struct libnvme_ctrl *p) { return p->firmware; @@ -702,18 +727,6 @@ __public const char *libnvme_host_get_hostsymname(const struct libnvme_host *p) return p->hostsymname; } -__public void libnvme_host_set_pdc_enabled_valid( - struct libnvme_host *p, - bool pdc_enabled_valid) -{ - p->pdc_enabled_valid = pdc_enabled_valid; -} - -__public bool libnvme_host_get_pdc_enabled_valid(const struct libnvme_host *p) -{ - return p->pdc_enabled_valid; -} - /**************************************************************************** * Accessors for: struct libnvme_fabric_options ****************************************************************************/ diff --git a/libnvme/src/nvme/accessors.h b/libnvme/src/nvme/accessors.h index 33484c723d..fe94781829 100644 --- a/libnvme/src/nvme/accessors.h +++ b/libnvme/src/nvme/accessors.h @@ -26,6 +26,7 @@ #include #include +#include /* Forward declarations. These are internal (opaque) structs. */ struct libnvme_fabrics_config; @@ -440,6 +441,14 @@ void libnvme_ns_set_name(struct libnvme_ns *p, const char *name); */ const char *libnvme_ns_get_name(const struct libnvme_ns *p); +/** + * libnvme_ns_get_generic_name() - Get generic_name. + * @p: The &struct libnvme_ns instance to query. + * + * Return: The value of the generic_name field, or NULL if not set. + */ +const char *libnvme_ns_get_generic_name(const struct libnvme_ns *p); + /** * libnvme_ns_set_sysfs_dir() - Set sysfs_dir. * @p: The &struct libnvme_ns instance to update. @@ -530,6 +539,30 @@ void libnvme_ns_set_lba_util(struct libnvme_ns *p, uint64_t lba_util); */ uint64_t libnvme_ns_get_lba_util(const struct libnvme_ns *p); +/** + * libnvme_ns_get_eui64() - Get eui64. + * @p: The &struct libnvme_ns instance to query. + * + * Return: Pointer to the eui64 array of 8 uint8_t elements. + */ +const uint8_t *libnvme_ns_get_eui64(const struct libnvme_ns *p); + +/** + * libnvme_ns_get_nguid() - Get nguid. + * @p: The &struct libnvme_ns instance to query. + * + * Return: Pointer to the nguid array of 16 uint8_t elements. + */ +const uint8_t *libnvme_ns_get_nguid(const struct libnvme_ns *p); + +/** + * libnvme_ns_get_csi() - Get csi. + * @p: The &struct libnvme_ns instance to query. + * + * Return: The value of the csi field. + */ +enum nvme_csi libnvme_ns_get_csi(const struct libnvme_ns *p); + /**************************************************************************** * Accessors for: struct libnvme_ctrl ****************************************************************************/ @@ -550,6 +583,14 @@ const char *libnvme_ctrl_get_name(const struct libnvme_ctrl *p); */ const char *libnvme_ctrl_get_sysfs_dir(const struct libnvme_ctrl *p); +/** + * libnvme_ctrl_get_address() - Get address. + * @p: The &struct libnvme_ctrl instance to query. + * + * Return: The value of the address field, or NULL if not set. + */ +const char *libnvme_ctrl_get_address(const struct libnvme_ctrl *p); + /** * libnvme_ctrl_get_firmware() - Get firmware. * @p: The &struct libnvme_ctrl instance to query. @@ -955,23 +996,6 @@ void libnvme_host_set_hostsymname( */ const char *libnvme_host_get_hostsymname(const struct libnvme_host *p); -/** - * libnvme_host_set_pdc_enabled_valid() - Set pdc_enabled_valid. - * @p: The &struct libnvme_host instance to update. - * @pdc_enabled_valid: Value to assign to the pdc_enabled_valid field. - */ -void libnvme_host_set_pdc_enabled_valid( - struct libnvme_host *p, - bool pdc_enabled_valid); - -/** - * libnvme_host_get_pdc_enabled_valid() - Get pdc_enabled_valid. - * @p: The &struct libnvme_host instance to query. - * - * Return: The value of the pdc_enabled_valid field. - */ -bool libnvme_host_get_pdc_enabled_valid(const struct libnvme_host *p); - /**************************************************************************** * Accessors for: struct libnvme_fabric_options ****************************************************************************/ diff --git a/libnvme/src/nvme/private.h b/libnvme/src/nvme/private.h index 94000a52cf..38b3e07270 100644 --- a/libnvme/src/nvme/private.h +++ b/libnvme/src/nvme/private.h @@ -196,23 +196,27 @@ struct libnvme_stat { double ts_ms; /* timestamp when the stat is updated */ }; -struct libnvme_path { // !generate-accessors:read=custom,write=none +struct libnvme_path { // !generate-accessors:read=custom,write=none struct list_node entry; struct list_node nentry; - struct libnvme_stat stat[2]; /* gendisk I/O stat */ - // curr_idx: current index into the stat[] - unsigned int curr_idx; // !access:read=generated,write=generated - bool diffstat; // !access:read=none + /* Double-buffered gendisk I/O stats: stat[curr_idx] is the latest + * snapshot, stat[!curr_idx] the previous one. curr_idx toggles on + * each update_stat() call; diffstat selects raw vs. delta for getters. + * Managed exclusively by the stat subsystem — do not access directly. + */ + struct libnvme_stat stat[2]; + unsigned int curr_idx; // !access:read=none + bool diffstat; // !access:read=none struct libnvme_ctrl *c; struct libnvme_ns *n; - char *name; // !access:read=generated,write=generated - char *sysfs_dir; // !access:read=generated,write=generated + char *name; // !access:read=generated,write=generated + char *sysfs_dir; // !access:read=generated,write=generated char *ana_state; char *numa_nodes; - int grpid; // !access:read=generated,write=generated + int grpid; // !access:read=generated,write=generated int queue_depth; long multipath_failover_count; long command_retry_count; @@ -235,14 +239,19 @@ struct libnvme_ns { // !generate-accessors struct libnvme_global_ctx *ctx; - struct libnvme_stat stat[2]; /* gendisk I/O stat */ - unsigned int curr_idx; /* current index into the stat[] */ - bool diffstat; // !access:read=none,write=none + /* Double-buffered gendisk I/O stats: stat[curr_idx] is the latest + * snapshot, stat[!curr_idx] the previous one. curr_idx toggles on + * each update_stat() call; diffstat selects raw vs. delta for getters. + * Managed exclusively by the stat subsystem — do not access directly. + */ + struct libnvme_stat stat[2]; + unsigned int curr_idx; // !access:read=none,write=none + bool diffstat; // !access:read=none,write=none struct libnvme_transport_handle *hdl; __u32 nsid; char *name; - char *generic_name; // !access:read=custom,write=none + char *generic_name; // !access:write=none char *sysfs_dir; int lba_shift; @@ -251,10 +260,10 @@ struct libnvme_ns { // !generate-accessors uint64_t lba_count; uint64_t lba_util; - uint8_t eui64[8]; - uint8_t nguid[16]; - unsigned char uuid[NVME_UUID_LEN]; - enum nvme_csi csi; + uint8_t eui64[8]; // !access:write=none + uint8_t nguid[16]; // !access:write=none + unsigned char uuid[NVME_UUID_LEN]; // !access:read=none,write=none + enum nvme_csi csi; // !access:write=none long command_retry_count; // !access:read=custom,write=none long command_error_count; // !access:read=custom,write=none @@ -262,7 +271,7 @@ struct libnvme_ns { // !generate-accessors long fail_no_available_path_count; // !access:read=custom,write=none }; -struct libnvme_ctrl { // !generate-accessors:read=generated,write=none +struct libnvme_ctrl { // !generate-accessors:read=generated,write=none struct list_node entry; struct list_head paths; struct list_head namespaces; @@ -272,7 +281,7 @@ struct libnvme_ctrl { // !generate-accessors:read=generated,write=none struct libnvme_transport_handle *hdl; char *name; char *sysfs_dir; - char *address; // !access:read=custom + char *address; char *firmware; char *model; char *state; // !access:read=custom @@ -305,7 +314,7 @@ struct libnvme_ctrl { // !generate-accessors:read=generated,write=none struct libnvme_fabrics_config cfg; }; -struct libnvme_subsystem { // !generate-accessors:read=generated,write=none +struct libnvme_subsystem { // !generate-accessors:read=generated,write=none struct list_node entry; struct list_head ctrls; struct list_head namespaces; @@ -331,9 +340,13 @@ struct libnvme_host { // !generate-accessors char *hostid; // !access:read=generated,write=none char *dhchap_host_key; char *hostsymname; + + /* pdc_enabled and pdc_enabled_valid work together. pdc_enabled_valid, + * when true, indicates that pdc_enabled has been explicitly defined. + * pdc_enabled_valid is internal meta-data for pdc_enabled. + */ bool pdc_enabled; // !access:read=none,write=custom - bool pdc_enabled_valid; /* set if pdc_enabled doesn't have an undefined - * value */ + bool pdc_enabled_valid; // !access:read=none,write=none }; struct libnvme_fabric_options { // !generate-accessors diff --git a/libnvme/src/nvme/tree.c b/libnvme/src/nvme/tree.c index 12bc293c49..36dc94671f 100644 --- a/libnvme/src/nvme/tree.c +++ b/libnvme/src/nvme/tree.c @@ -2603,11 +2603,6 @@ const char *libnvme_ns_head_get_sysfs_dir(libnvme_ns_head_t head) return head->sysfs_dir; } -__public const char *libnvme_ns_get_generic_name(libnvme_ns_t n) -{ - return n->generic_name; -} - __public const char *libnvme_ns_get_model(libnvme_ns_t n) { return n->c ? n->c->model : n->s->model; @@ -2623,22 +2618,7 @@ __public const char *libnvme_ns_get_firmware(libnvme_ns_t n) return n->c ? n->c->firmware : n->s->firmware; } -__public enum nvme_csi libnvme_ns_get_csi(libnvme_ns_t n) -{ - return n->csi; -} - -__public const uint8_t *libnvme_ns_get_eui64(libnvme_ns_t n) -{ - return n->eui64; -} - -__public const uint8_t *libnvme_ns_get_nguid(libnvme_ns_t n) -{ - return n->nguid; -} - -__public void libnvme_ns_get_uuid(libnvme_ns_t n, +__public void libnvme_ns_copy_uuid(libnvme_ns_t n, unsigned char out[NVME_UUID_LEN]) { memcpy(out, n->uuid, NVME_UUID_LEN); diff --git a/libnvme/src/nvme/tree.h b/libnvme/src/nvme/tree.h index 48f1beb494..439f69ca3a 100644 --- a/libnvme/src/nvme/tree.h +++ b/libnvme/src/nvme/tree.h @@ -478,37 +478,13 @@ libnvme_ns_t libnvme_subsystem_next_ns(libnvme_subsystem_t s, libnvme_ns_t n); p = libnvme_namespace_next_path(n, p)) /** - * libnvme_ns_get_csi() - Command set identifier of a namespace - * @n: Namespace instance - * - * Return: The namespace's command set identifier in use - */ -enum nvme_csi libnvme_ns_get_csi(libnvme_ns_t n); - -/** - * libnvme_ns_get_eui64() - 64-bit eui of a namespace - * @n: Namespace instance - * - * Return: A pointer to the 64-bit eui - */ -const uint8_t *libnvme_ns_get_eui64(libnvme_ns_t n); - -/** - * libnvme_ns_get_nguid() - 128-bit nguid of a namespace - * @n: Namespace instance - * - * Return: A pointer to the 128-bit nguid - */ -const uint8_t *libnvme_ns_get_nguid(libnvme_ns_t n); - -/** - * libnvme_ns_get_uuid() - UUID of a namespace + * libnvme_ns_copy_uuid() - Copy UUID of a namespace into a caller buffer * @n: Namespace instance * @out: buffer for the UUID * * Copies the namespace's uuid into @out */ -void libnvme_ns_get_uuid(libnvme_ns_t n, unsigned char out[NVME_UUID_LEN]); +void libnvme_ns_copy_uuid(libnvme_ns_t n, unsigned char out[NVME_UUID_LEN]); /** * libnvme_ns_get_command_retry_count() - Get command retry count @@ -544,14 +520,6 @@ long libnvme_ns_get_requeue_no_usable_path_count(libnvme_ns_t n); */ long libnvme_ns_get_fail_no_available_path_count(libnvme_ns_t n); -/** - * libnvme_ns_get_generic_name() - Returns name of generic namespace chardev. - * @n: Namespace instance - * - * Return: Name of generic namespace chardev - */ -const char *libnvme_ns_get_generic_name(libnvme_ns_t n); - /** * libnvme_ns_get_firmware() - Firmware string of a namespace * @n: Namespace instance diff --git a/libnvme/test/test.c b/libnvme/test/test.c index 756601c31d..d2b1e34115 100644 --- a/libnvme/test/test.c +++ b/libnvme/test/test.c @@ -452,7 +452,7 @@ int main(int argc, char **argv) print_hex(libnvme_ns_get_eui64(n), 8); printf(" nguid:"); print_hex(libnvme_ns_get_nguid(n), 16); - libnvme_ns_get_uuid(n, uuid); + libnvme_ns_copy_uuid(n, uuid); libnvme_uuid_to_string(uuid, uuid_str); printf(" uuid:%s csi:%d\n", uuid_str, libnvme_ns_get_csi(n)); diff --git a/libnvme/tools/generator/generate-accessors.py b/libnvme/tools/generator/generate-accessors.py index 59576affd5..9c8f47c976 100755 --- a/libnvme/tools/generator/generate-accessors.py +++ b/libnvme/tools/generator/generate-accessors.py @@ -168,9 +168,28 @@ r'^(const\s+)?char\s+([A-Za-z_][A-Za-z0-9_]*)\s*\[\s*([A-Za-z0-9_]+)\s*\]\s*;' ) -# Matches: [const] type[*] name; +# Matches: [const] type_word [type_word ...] [*[*]] name ; +# Supports multi-word types such as "enum tag", "unsigned int", and +# "unsigned long long". Backtracking resolves the ambiguity between the +# final type word and the member name: the engine tries the longest type +# first and retreats until the pointer/space group and name can be satisfied. MEMBER_RE = re.compile( - r'^(const\s+)?([A-Za-z_][A-Za-z0-9_]*)([*\s]+)([A-Za-z_][A-Za-z0-9_]*)\s*;' + r'^(const\s+)?' + r'((?:[A-Za-z_][A-Za-z0-9_]*)(?:\s+[A-Za-z_][A-Za-z0-9_]*)*)' + r'([*\s]+)' + r'([A-Za-z_][A-Za-z0-9_]*)\s*;' +) + +# Matches: [const] type_word [type_word ...] name[size] ; +# For fixed-size arrays of scalar types (e.g. uint8_t eui64[8], +# unsigned char uuid[NVME_UUID_LEN]). char arrays are caught first +# by CHAR_ARRAY_RE and never reach this regex. +SCALAR_ARRAY_RE = re.compile( + r'^(const\s+)?' + r'((?:[A-Za-z_][A-Za-z0-9_]*)(?:\s+[A-Za-z_][A-Za-z0-9_]*)*)' + r'\s+' + r'([A-Za-z_][A-Za-z0-9_]*)' + r'\s*\[\s*([A-Za-z0-9_]+)\s*\]\s*;' ) @@ -304,17 +323,19 @@ class Member: """ __slots__ = ('name', 'type', 'read_mode', 'write_mode', - 'is_char_array', 'is_char_ptr_array', 'array_size') + 'is_char_array', 'is_char_ptr_array', 'is_scalar_array', + 'array_size') def __init__(self, name, type_str, read_mode, write_mode, - is_char_array, is_char_ptr_array, array_size): + is_char_array, is_char_ptr_array, is_scalar_array, array_size): self.name = name self.type = type_str # e.g. "const char *", "int", "__u32" self.read_mode = read_mode # 'generated' | 'custom' | 'none' self.write_mode = write_mode # 'generated' | 'custom' | 'none' self.is_char_array = is_char_array self.is_char_ptr_array = is_char_ptr_array - self.array_size = array_size # only for fixed-size char arrays (char[N]) + self.is_scalar_array = is_scalar_array + self.array_size = array_size # for fixed-size arrays (char[N] or type[N]) # --------------------------------------------------------------------------- @@ -383,10 +404,27 @@ def parse_members(struct_name, raw_body, struct_defaults, verbose): write_mode='none' if is_const_qual else write_mode, is_char_array=True, is_char_ptr_array=False, + is_scalar_array=False, array_size=m.group(3), )) continue + # --- fixed-size scalar array: [const] type name[size]; ---------- + m = SCALAR_ARRAY_RE.match(clean) + if m: + is_const_qual = bool(m.group(1)) + members.append(Member( + name=m.group(3), + type_str=m.group(2), + read_mode=read_mode, + write_mode='none' if is_const_qual else write_mode, + is_char_array=False, + is_char_ptr_array=False, + is_scalar_array=True, + array_size=m.group(4), + )) + continue + # --- general member: [const] type[*] name; ---------------------- m = MEMBER_RE.match(clean) if m: @@ -415,6 +453,7 @@ def parse_members(struct_name, raw_body, struct_defaults, verbose): write_mode='none' if is_const_qual else write_mode, is_char_array=False, is_char_ptr_array=(ptr_depth == 2), + is_scalar_array=False, array_size=None, )) @@ -842,9 +881,65 @@ def emit_hdr_getter(f, prefix, sname, mname, mtype, is_dyn_str): ) +def emit_hdr_setter_scalar_array(f, prefix, sname, mname, elem_type, array_size): + """Emit a header declaration for a fixed-size scalar-array setter.""" + fn = _set_name(prefix, sname, mname) + f.write( + f'/**\n' + f'{kdoc_summary(fn, f"Set {mname}.", "Setter.")}\n' + f' * @p: The &struct {sname} instance to update.\n' + f' * @{mname}: Array of {array_size} elements; copied into the struct.\n' + f' */\n' + ) + single = (f'void {_set_name(prefix, sname, mname)}' + f'(struct {sname} *p, const {elem_type} {mname}[{array_size}]);') + if fits_80(single): + f.write(single + '\n\n') + else: + f.write( + f'void {_set_name(prefix, sname, mname)}(\n' + f'\t\tstruct {sname} *p,\n' + f'\t\tconst {elem_type} {mname}[{array_size}]);\n\n' + ) + + +def emit_hdr_getter_scalar_array(f, prefix, sname, mname, elem_type, array_size): + """Emit a header declaration for a fixed-size scalar-array getter.""" + fn = _get_name(prefix, sname, mname) + ret_type = f'const {elem_type} *' + f.write( + f'/**\n' + f'{kdoc_summary(fn, f"Get {mname}.", "Getter.")}\n' + f' * @p: The &struct {sname} instance to query.\n' + f' *\n' + f' * Return: Pointer to the {mname} array' + f' of {array_size} {elem_type} elements.\n' + f' */\n' + ) + single = (f'{ret_type}{_get_name(prefix, sname, mname)}' + f'(const struct {sname} *p);') + if fits_80(single): + f.write(single + '\n\n') + else: + f.write( + f'{ret_type}{_get_name(prefix, sname, mname)}(\n' + f'\t\tconst struct {sname} *p);\n\n' + ) + + def generate_hdr(f, prefix, struct_name, members): """Write header declarations for all members of one struct.""" for member in members: + if member.is_scalar_array: + if member.write_mode == 'generated': + emit_hdr_setter_scalar_array(f, prefix, struct_name, + member.name, member.type, + member.array_size) + if member.read_mode == 'generated': + emit_hdr_getter_scalar_array(f, prefix, struct_name, + member.name, member.type, + member.array_size) + continue is_dyn_str = (not member.is_char_array and not member.is_char_ptr_array and member.type == 'const char *') @@ -992,9 +1087,48 @@ def emit_src_getter(f, prefix, sname, mname, mtype, cast=None): ) +def emit_src_setter_scalar_array(f, prefix, sname, mname, elem_type, array_size): + """Emit a fixed-size scalar-array setter (memcpy).""" + sig = (f'{PUB}void {_set_name(prefix, sname, mname)}' + f'(struct {sname} *p, const {elem_type} {mname}[{array_size}])') + if fits_80(sig): + f.write(sig + '\n') + else: + f.write( + f'{PUB}void {_set_name(prefix, sname, mname)}(\n' + f'\t\tstruct {sname} *p,\n' + f'\t\tconst {elem_type} {mname}[{array_size}])\n' + ) + f.write(f'{{\n\tmemcpy(p->{mname}, {mname}, sizeof(p->{mname}));\n}}\n\n') + + +def emit_src_getter_scalar_array(f, prefix, sname, mname, elem_type): + """Emit a fixed-size scalar-array getter (return pointer to first element).""" + ret_type = f'const {elem_type} *' + sig = (f'{PUB}{ret_type}{_get_name(prefix, sname, mname)}' + f'(const struct {sname} *p)') + if fits_80(sig): + f.write(sig + '\n') + else: + f.write( + f'{PUB}{ret_type}{_get_name(prefix, sname, mname)}(\n' + f'\t\tconst struct {sname} *p)\n' + ) + f.write(f'{{\n\treturn p->{mname};\n}}\n\n') + + def generate_src(f, prefix, struct_name, members): """Write source implementations for all members of one struct.""" for member in members: + if member.is_scalar_array: + if member.write_mode == 'generated': + emit_src_setter_scalar_array(f, prefix, struct_name, + member.name, member.type, + member.array_size) + if member.read_mode == 'generated': + emit_src_getter_scalar_array(f, prefix, struct_name, + member.name, member.type) + continue is_dyn_str = (not member.is_char_array and not member.is_char_ptr_array and member.type == 'const char *') @@ -1340,6 +1474,7 @@ def main(): f'#include \n' f'#include \n\n' f'#include \n' + f'#include \n' f'\n' ) f.write('/* Forward declarations. These are internal (opaque) structs. */\n')