@@ -10165,6 +10165,94 @@ static int get_rotational_media_info_log(int argc, char **argv, struct command *
1016510165 return err ;
1016610166}
1016710167
10168+ static int get_dispersed_ns_psub (struct nvme_dev * dev , __u32 nsid ,
10169+ struct nvme_dispersed_ns_participating_nss_log * * logp )
10170+ {
10171+ int err ;
10172+ __u64 header_len = sizeof (* * logp );
10173+ __u64 psub_list_len ;
10174+ struct nvme_get_log_args args = {
10175+ .args_size = sizeof (args ),
10176+ .fd = dev_fd (dev ),
10177+ .timeout = NVME_DEFAULT_IOCTL_TIMEOUT ,
10178+ .lid = NVME_LOG_LID_DISPERSED_NS_PARTICIPATING_NSS ,
10179+ .nsid = nsid ,
10180+ .lpo = header_len ,
10181+ };
10182+ struct nvme_dispersed_ns_participating_nss_log * log = nvme_alloc (header_len );
10183+
10184+ if (!log )
10185+ return - ENOMEM ;
10186+
10187+ err = nvme_cli_get_log_dispersed_ns_participating_nss (dev , nsid , header_len , log );
10188+ if (err )
10189+ goto err_free ;
10190+
10191+ psub_list_len = le64_to_cpu (log -> numpsub ) * NVME_NQN_LENGTH ;
10192+
10193+ log = nvme_realloc (log , header_len + psub_list_len );
10194+ if (!log ) {
10195+ err = - ENOMEM ;
10196+ goto err_free ;
10197+ }
10198+
10199+ args .log = log -> participating_nss ,
10200+ args .len = psub_list_len ;
10201+
10202+ err = nvme_cli_get_log_page (dev , NVME_LOG_PAGE_PDU_SIZE , & args );
10203+ if (err )
10204+ goto err_free ;
10205+
10206+ * logp = log ;
10207+ return 0 ;
10208+
10209+ err_free :
10210+ free (log );
10211+ return err ;
10212+ }
10213+
10214+ static int get_dispersed_ns_participating_nss_log (int argc , char * * argv , struct command * cmd ,
10215+ struct plugin * plugin )
10216+ {
10217+ const char * desc = "Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it" ;
10218+ nvme_print_flags_t flags ;
10219+ int err ;
10220+
10221+ _cleanup_nvme_dev_ struct nvme_dev * dev = NULL ;
10222+
10223+ _cleanup_free_ struct nvme_dispersed_ns_participating_nss_log * log = NULL ;
10224+
10225+ struct config {
10226+ __u32 namespace_id ;
10227+ };
10228+
10229+ struct config cfg = {
10230+ .namespace_id = 1 ,
10231+ };
10232+
10233+ NVME_ARGS (opts , OPT_UINT ("namespace-id" , 'n' , & cfg .namespace_id , namespace_id_desired ));
10234+
10235+ err = parse_and_open (& dev , argc , argv , desc , opts );
10236+ if (err )
10237+ return err ;
10238+
10239+ err = validate_output_format (nvme_cfg .output_format , & flags );
10240+ if (err < 0 ) {
10241+ nvme_show_error ("Invalid output format" );
10242+ return err ;
10243+ }
10244+
10245+ err = get_dispersed_ns_psub (dev , cfg .namespace_id , & log );
10246+ if (!err )
10247+ nvme_show_dispersed_ns_psub_log (log , flags );
10248+ else if (err > 0 )
10249+ nvme_show_status (err );
10250+ else
10251+ nvme_show_perror ("dispersed ns participating nss log" );
10252+
10253+ return err ;
10254+ }
10255+
1016810256void register_extension (struct plugin * plugin )
1016910257{
1017010258 plugin -> parent = & nvme ;
0 commit comments