Index: sys/cam/ata/ata_da.c =================================================================== --- sys/cam/ata/ata_da.c +++ sys/cam/ata/ata_da.c @@ -3420,6 +3420,9 @@ softc->disk->d_fwheads = softc->params.heads; ata_disk_firmware_geom_adjust(softc->disk); softc->disk->d_rotation_rate = cgd->ident_data.media_rotation_rate; + strlcpy(softc->disk->d_dev_name, softc->cpi.dev_name, + sizeof(softc->disk->d_dev_name)); + softc->disk->d_unit_number = softc->cpi.unit_number; } static void Index: sys/cam/mmc/mmc_da.c =================================================================== --- sys/cam/mmc/mmc_da.c +++ sys/cam/mmc/mmc_da.c @@ -1532,6 +1532,9 @@ part->disk->d_hba_device = cpi.hba_device; part->disk->d_hba_subvendor = cpi.hba_subvendor; part->disk->d_hba_subdevice = cpi.hba_subdevice; + strlcpy(part->disk->d_dev_name, cpi.dev_name, + sizeof(part->disk->d_dev_name)); + part->disk->d_unit_number = cpi.unit_number; part->disk->d_sectorsize = mmc_get_sector_size(periph); part->disk->d_mediasize = media_size; Index: sys/cam/nvme/nvme_da.c =================================================================== --- sys/cam/nvme/nvme_da.c +++ sys/cam/nvme/nvme_da.c @@ -815,6 +815,8 @@ disk->d_hba_device = cpi.hba_device; disk->d_hba_subvendor = cpi.hba_subvendor; disk->d_hba_subdevice = cpi.hba_subdevice; + strlcpy(disk->d_dev_name, cpi.dev_name, sizeof(disk->d_dev_name)); + disk->d_unit_number = cpi.unit_number; disk->d_stripesize = disk->d_sectorsize; disk->d_stripeoffset = 0; disk->d_devstat = devstat_new_entry(periph->periph_name, Index: sys/cam/scsi/scsi_cd.c =================================================================== --- sys/cam/scsi/scsi_cd.c +++ sys/cam/scsi/scsi_cd.c @@ -702,6 +702,9 @@ softc->disk->d_hba_device = cpi.hba_device; softc->disk->d_hba_subvendor = cpi.hba_subvendor; softc->disk->d_hba_subdevice = cpi.hba_subdevice; + strlcpy(softc->disk->d_dev_name, cpi.dev_name, + sizeof(softc->disk->d_dev_name)); + softc->disk->d_unit_number = cpi.unit_number; /* * Acquire a reference to the periph before we register with GEOM. Index: sys/cam/scsi/scsi_da.c =================================================================== --- sys/cam/scsi/scsi_da.c +++ sys/cam/scsi/scsi_da.c @@ -2875,6 +2875,9 @@ softc->disk->d_hba_device = cpi.hba_device; softc->disk->d_hba_subvendor = cpi.hba_subvendor; softc->disk->d_hba_subdevice = cpi.hba_subdevice; + strlcpy(softc->disk->d_dev_name, cpi.dev_name, + sizeof(softc->disk->d_dev_name)); + softc->disk->d_unit_number = cpi.unit_number; /* * Acquire a reference to the periph before we register with GEOM. Index: sys/geom/geom_disk.h =================================================================== --- sys/geom/geom_disk.h +++ sys/geom/geom_disk.h @@ -118,6 +118,8 @@ uint16_t d_hba_subvendor; uint16_t d_hba_subdevice; uint16_t d_rotation_rate; + char d_dev_name[DISK_IDENT_SIZE]; + uint32_t d_unit_number; /* Fields private to the driver */ void *d_drv1; Index: sys/geom/geom_disk.c =================================================================== --- sys/geom/geom_disk.c +++ sys/geom/geom_disk.c @@ -528,7 +528,13 @@ else if (g_handleattr_uint16_t(bp, "GEOM::rotation_rate", dp->d_rotation_rate)) break; - else + else if (g_handleattr_str(bp, "GEOM::dev_name", + dp->d_dev_name)) + break; + else if (g_handleattr_int(bp, "GEOM::unit_number", + dp->d_unit_number)) + break; + else error = ENOIOCTL; break; case BIO_FLUSH: Index: usr.sbin/diskinfo/diskinfo.c =================================================================== --- usr.sbin/diskinfo/diskinfo.c +++ usr.sbin/diskinfo/diskinfo.c @@ -67,6 +67,7 @@ static int opt_c, opt_i, opt_p, opt_s, opt_S, opt_t, opt_v, opt_w; static bool candelete(int fd); +static bool hba_name(int fd, char *hbaname, size_t buflen); static void speeddisk(int fd, off_t mediasize, u_int sectorsize); static void commandtime(int fd, off_t mediasize, u_int sectorsize); static void iopsbench(int fd, off_t mediasize, u_int sectorsize); @@ -82,7 +83,8 @@ { struct stat sb; int i, ch, fd, error, exitval = 0; - char tstr[BUFSIZ], ident[DISK_IDENT_SIZE], physpath[MAXPATHLEN]; + char tstr[BUFSIZ], ident[DISK_IDENT_SIZE], physpath[MAXPATHLEN], + hbaname[MAXPATHLEN]; char zone_desc[64]; char rrate[64]; struct diocgattr_arg arg; @@ -251,6 +253,8 @@ printf("\t%-12s\t# Disk descr.\n", arg.value.str); if (ioctl(fd, DIOCGIDENT, ident) == 0) printf("\t%-12s\t# Disk ident.\n", ident); + if (hba_name(fd, hbaname, sizeof(hbaname))) + printf("\t%-12s\t# HBA device name\n", hbaname); if (ioctl(fd, DIOCGPHYSPATH, physpath) == 0) printf("\t%-12s\t# Physical path\n", physpath); printf("\t%-12s\t# TRIM/UNMAP support\n", @@ -287,6 +291,27 @@ return (arg.value.i != 0); else return (false); +} + +static bool +hba_name(int fd, char *hbaname, size_t buflen) +{ + struct diocgattr_arg arg1, arg2; + int ret; + + strlcpy(arg1.name, "GEOM::dev_name", sizeof(arg1.name)); + arg1.len = sizeof(arg1.value.str); + ret = ioctl(fd, DIOCGATTR, &arg1); + if (ret != 0 || arg1.value.str[0] == '\0') + return (false); + strlcpy(arg2.name, "GEOM::unit_number", sizeof(arg2.name)); + arg2.len = sizeof(arg2.value.i); + ret = ioctl(fd, DIOCGATTR, &arg2); + if (ret != 0) + return (false); + + snprintf(hbaname, buflen, "%s%d", arg1.value.str, arg2.value.i); + return (true); } static void