1
0
Fork 0

Adding upstream version 2.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-16 12:15:30 +01:00
parent 50aec1e4c5
commit 1b3a431c1d
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
521 changed files with 21541 additions and 21644 deletions

View file

@ -21,12 +21,13 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>
#include <uuid/uuid.h>
#include "common.h"
#include "nvme.h"
#include "nvme-ioctl.h"
#include "libnvme.h"
#include "suffix.h"
#include "util/suffix.h"
#define CREATE_CMD
#include "netapp-nvme.h"
@ -56,17 +57,17 @@ enum {
static const char *dev_path = "/dev/";
struct smdevice_info {
int nsid;
unsigned nsid;
struct nvme_id_ctrl ctrl;
struct nvme_id_ns ns;
char dev[265];
};
struct ontapdevice_info {
int nsid;
unsigned nsid;
struct nvme_id_ctrl ctrl;
struct nvme_id_ns ns;
char nsdesc[4096];
uuid_t uuid;
unsigned char log_data[ONTAP_C2_LOG_SIZE];
char dev[265];
};
@ -105,24 +106,15 @@ static void netapp_nguid_to_str(char *str, __u8 *nguid)
static void netapp_get_ns_size(char *size, long long *lba,
struct nvme_id_ns *ns)
{
*lba = 1 << ns->lbaf[(ns->flbas & 0x0F)].ds;
__u8 lba_index;
nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &lba_index);
*lba = 1 << ns->lbaf[lba_index].ds;
double nsze = le64_to_cpu(ns->nsze) * (*lba);
const char *s_suffix = suffix_si_get(&nsze);
sprintf(size, "%.2f%sB", nsze, s_suffix);
}
static void netapp_uuid_to_str(char *str, void *data)
{
#ifdef LIBUUID
uuid_t uuid;
struct nvme_ns_id_desc *desc = data;
memcpy(uuid, data + sizeof(*desc), 16);
uuid_unparse_lower(uuid, str);
#endif
}
static void ontap_labels_to_str(char *dst, char *src, int count)
{
int i;
@ -249,6 +241,7 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int
"Volume ID %s, Controller %c, Access State %s, %s\n";
char columnstr[] = "%-16s %-30s %-30s %4d %32s %c %-12s %9s\n";
char *formatstr = basestr; /* default to "normal" output format */
__u8 lba_index;
if (format == NCOLUMN) {
/* for column output, change output string and print column headers */
@ -265,11 +258,12 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int
else if (format == NJSON) {
/* prepare for json output */
root = json_create_object();
json_devices = json_create_object();
json_devices = json_create_array();
}
for (i = 0; i < count; i++) {
long long int lba = 1 << devices[i].ns.lbaf[(devices[i].ns.flbas & 0x0F)].ds;
nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index);
long long int lba = 1 << devices[i].ns.lbaf[lba_index].ds;
double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
const char *s_suffix = suffix_si_get(&nsze);
char size[128];
@ -296,6 +290,8 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int
/* complete the json output */
json_object_add_value_array(root, "SMdevices", json_devices);
json_print_object(root, NULL);
printf("\n");
json_free_object(root);
}
}
@ -331,13 +327,13 @@ static void netapp_ontapdevices_print(struct ontapdevice_info *devices,
} else if (format == NJSON) {
/* prepare for json output */
root = json_create_object();
json_devices = json_create_object();
json_devices = json_create_array();
}
for (i = 0; i < count; i++) {
netapp_get_ns_size(size, &lba, &devices[i].ns);
netapp_uuid_to_str(uuid_str, devices[i].nsdesc);
uuid_unparse_lower(devices[i].uuid, uuid_str);
netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
if (format == NJSON) {
@ -354,16 +350,18 @@ static void netapp_ontapdevices_print(struct ontapdevice_info *devices,
/* complete the json output */
json_object_add_value_array(root, "ONTAPdevices", json_devices);
json_print_object(root, NULL);
printf("\n");
json_free_object(root);
}
}
static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen)
{
struct nvme_admin_cmd get_log;
struct nvme_passthru_cmd get_log;
int err;
memset(buf, 0, buflen);
memset(&get_log, 0, sizeof(struct nvme_admin_cmd));
memset(&get_log, 0, sizeof(struct nvme_passthru_cmd));
get_log.opcode = nvme_admin_get_log_page;
get_log.nsid = nsid;
@ -378,7 +376,7 @@ static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen)
get_log.cdw10 |= ONTAP_C2_LOG_NSINFO_LSP << 8;
get_log.cdw11 = numdu;
err = nvme_submit_admin_passthru(fd, &get_log);
err = nvme_submit_admin_passthru(fd, &get_log, NULL);
if (err) {
fprintf(stderr, "ioctl error %0x\n", err);
return 1;
@ -402,8 +400,8 @@ static int netapp_smdevices_get_info(int fd, struct smdevice_info *item,
if (strncmp("NetApp E-Series", item->ctrl.mn, 15) != 0)
return 0; /* not the right model of controller */
item->nsid = nvme_get_nsid(fd);
err = nvme_identify_ns(fd, item->nsid, 0, &item->ns);
err = nvme_get_nsid(fd, &item->nsid);
err = nvme_identify_ns(fd, item->nsid, &item->ns);
if (err) {
fprintf(stderr, "Unable to identify namespace for %s (%s)\n",
dev, strerror(err));
@ -418,6 +416,7 @@ static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item,
const char *dev)
{
int err;
void *nsdescs;
err = nvme_identify_ctrl(fd, &item->ctrl);
if (err) {
@ -430,22 +429,30 @@ static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item,
/* not the right controller model */
return 0;
item->nsid = nvme_get_nsid(fd);
err = nvme_get_nsid(fd, &item->nsid);
err = nvme_identify_ns(fd, item->nsid, 0, &item->ns);
err = nvme_identify_ns(fd, item->nsid, &item->ns);
if (err) {
fprintf(stderr, "Unable to identify namespace for %s (%s)\n",
dev, strerror(err));
return 0;
}
err = nvme_identify_ns_descs(fd, item->nsid, item->nsdesc);
if (posix_memalign(&nsdescs, getpagesize(), 0x1000)) {
fprintf(stderr, "Cannot allocate controller list payload\n");
return 0;
}
err = nvme_identify_ns_descs(fd, item->nsid, nsdescs);
if (err) {
fprintf(stderr, "Unable to identify namespace descriptor for %s (%s)\n",
dev, strerror(err));
return 0;
}
memcpy(item->uuid, nsdescs + sizeof(struct nvme_ns_id_desc), sizeof(item->uuid));
free(nsdescs);
err = nvme_get_ontap_c2_log(fd, item->nsid, item->log_data, ONTAP_C2_LOG_SIZE);
if (err) {
fprintf(stderr, "Unable to get log page data for %s (%s)\n",