summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/diskinfo/diskinfo.c96
1 files changed, 54 insertions, 42 deletions
diff --git a/usr/src/cmd/diskinfo/diskinfo.c b/usr/src/cmd/diskinfo/diskinfo.c
index 84c5a692a7..d5b0c82787 100644
--- a/usr/src/cmd/diskinfo/diskinfo.c
+++ b/usr/src/cmd/diskinfo/diskinfo.c
@@ -216,25 +216,10 @@ static void
enumerate_disks(di_opts_t *opts)
{
topo_hdl_t *hp = NULL;
- dm_descriptor_t *media;
- int e, i;
int filter[] = { DM_DT_FIXED, -1 };
- dm_descriptor_t *disk, *controller;
- nvlist_t *mattrs, *dattrs, *cattrs = NULL;
-
- uint64_t size, total;
- uint32_t blocksize;
- double total_in_GiB;
- char sizestr[32];
- char slotname[32];
- char statestr[8];
-
- char *vid, *pid, *opath, *c, *ctype = NULL;
- boolean_t removable;
- boolean_t ssd;
- char device[MAXPATHLEN];
- di_phys_t phys;
- size_t len;
+ dm_descriptor_t *media;
+ uint_t i;
+ int e;
e = 0;
if ((media = dm_get_descriptors(DM_MEDIA, filter, &e)) == NULL) {
@@ -264,6 +249,20 @@ enumerate_disks(di_opts_t *opts)
}
for (i = 0; media != NULL && media[i] != 0; i++) {
+ dm_descriptor_t *disk, *controller;
+ nvlist_t *mattrs, *dattrs;
+ char *vid, *pid, *opath, *ctype, *pctype, *c;
+ boolean_t removable, ssd;
+ char device[MAXPATHLEN];
+ di_phys_t phys;
+ size_t len;
+ uint64_t size, total;
+ uint32_t blocksize;
+ double total_in_GiB;
+ char sizestr[32];
+ char slotname[32];
+ char statestr[8];
+
if ((disk = dm_get_associated_descriptors(media[i],
DM_DRIVE, &e)) == NULL) {
continue;
@@ -274,37 +273,50 @@ enumerate_disks(di_opts_t *opts)
* info with DKIOCGMEDIAINFO which may not be the case for
* disks which are failing.
*/
- if ((mattrs = dm_get_attributes(media[i], &e)) == NULL) {
+ if ((mattrs = dm_get_attributes(media[i], &e)) == NULL)
continue;
- }
e = nvlist_lookup_uint64(mattrs, DM_SIZE, &size);
assert(e == 0);
e = nvlist_lookup_uint32(mattrs, DM_BLOCKSIZE, &blocksize);
assert(e == 0);
- nvlist_free(mattrs);
- dattrs = dm_get_attributes(disk[0], &e);
+ vid = pid = opath = "-";
+ removable = B_FALSE;
+ ssd = B_FALSE;
- nvlist_query_string(dattrs, DM_VENDOR_ID, &vid);
- nvlist_query_string(dattrs, DM_PRODUCT_ID, &pid);
- nvlist_query_string(dattrs, DM_OPATH, &opath);
+ dattrs = dm_get_attributes(disk[0], &e);
+ if (dattrs != NULL) {
+ nvlist_query_string(dattrs, DM_VENDOR_ID, &vid);
+ nvlist_query_string(dattrs, DM_PRODUCT_ID, &pid);
+ nvlist_query_string(dattrs, DM_OPATH, &opath);
- removable = B_FALSE;
- if (nvlist_lookup_boolean(dattrs, DM_REMOVABLE) == 0)
- removable = B_TRUE;
+ if (nvlist_lookup_boolean(dattrs, DM_REMOVABLE) == 0)
+ removable = B_TRUE;
- ssd = B_FALSE;
- if (nvlist_lookup_boolean(dattrs, DM_SOLIDSTATE) == 0)
- ssd = B_TRUE;
+ if (nvlist_lookup_boolean(dattrs, DM_SOLIDSTATE) == 0)
+ ssd = B_TRUE;
+ }
+ pctype = "-";
+ ctype = NULL;
if ((controller = dm_get_associated_descriptors(disk[0],
DM_CONTROLLER, &e)) != NULL) {
+ nvlist_t *cattrs;
+
cattrs = dm_get_attributes(controller[0], &e);
- nvlist_query_string(cattrs, DM_CTYPE, &ctype);
- ctype = strdup(ctype);
- for (c = ctype; *c != '\0'; c++)
- *c = toupper(*c);
+ if (cattrs != NULL) {
+ nvlist_query_string(cattrs, DM_CTYPE, &ctype);
+ ctype = strdup(ctype);
+ nvlist_free(cattrs);
+
+ if (ctype != NULL) {
+ for (c = ctype; *c != '\0'; c++)
+ *c = toupper(*c);
+ pctype = ctype;
+ }
+ }
+ dm_free_descriptors(controller);
}
/*
@@ -318,8 +330,9 @@ enumerate_disks(di_opts_t *opts)
(void) strlcpy(device, opath, sizeof (device));
len = strlen(device);
if (device[len - 2] == 's' &&
- (device[len - 1] >= '0' && device[len - 1] <= '9'))
+ (device[len - 1] >= '0' && device[len - 1] <= '9')) {
device[len - 2] = '\0';
+ }
if (hp != NULL) {
bzero(&phys, sizeof (phys));
@@ -386,25 +399,25 @@ enumerate_disks(di_opts_t *opts)
} else if (opts->di_condensed) {
if (opts->di_scripted) {
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
- ctype, device, vid, pid,
+ pctype, device, vid, pid,
display_string(phys.dp_serial),
sizestr, statestr, slotname);
} else {
printf("%-7s %-22s %-8s %-16s "
"%-20s\n\t%-13s %-4s %s\n",
- ctype, device, vid, pid,
+ pctype, device, vid, pid,
display_string(phys.dp_serial),
sizestr, statestr, slotname);
}
} else {
if (opts->di_scripted) {
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
- ctype, device, vid, pid, sizestr,
+ pctype, device, vid, pid, sizestr,
display_tristate(removable),
display_tristate(ssd));
} else {
printf("%-7s %-22s %-8s %-16s "
- "%-13s %-3s %-3s\n", ctype, device,
+ "%-13s %-3s %-3s\n", pctype, device,
vid, pid, sizestr,
display_tristate(removable),
display_tristate(ssd));
@@ -412,9 +425,8 @@ enumerate_disks(di_opts_t *opts)
}
free(ctype);
- nvlist_free(cattrs);
nvlist_free(dattrs);
- dm_free_descriptors(controller);
+ nvlist_free(mattrs);
dm_free_descriptors(disk);
}