Print this page
OS-2444 richmond hardware maps need to support ivy bridge (review fixes)
*** 32,106 ****
#include "disk.h"
#include "disk_drivers.h"
/*
* Request the SAS address of the disk (if any) attached to this mpt_sas
! * instance at (Enclosure Number, Slot Number).
! *
! * Returns:
! * -2 /devices node (*devctl) does not exist
! * -1 All other failures
! * 0 Success
*/
static int
get_sas_address(topo_mod_t *mod, char *devctl, uint32_t enclosure,
uint32_t slot, char **sas_address)
{
! int fd, err, i;
mptsas_get_disk_info_t gdi;
mptsas_disk_info_t *di;
size_t disz;
bzero(&gdi, sizeof (gdi));
if ((fd = open(devctl, O_RDWR)) == -1) {
! int rc = (errno == ENOENT ? -2 : -1);
topo_mod_dprintf(mod, "could not open '%s' for ioctl: %s\n",
devctl, strerror(errno));
! return (rc);
}
if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
topo_mod_dprintf(mod, "ioctl 1 on '%s' failed: %s\n", devctl,
strerror(errno));
! (void) close(fd);
! return (-1);
}
gdi.DiskInfoArraySize = disz = sizeof (mptsas_disk_info_t) *
gdi.DiskCount;
gdi.PtrDiskInfoArray = di = topo_mod_alloc(mod, disz);
if (di == NULL) {
topo_mod_dprintf(mod, "memory allocation failed\n");
! (void) close(fd);
! return (-1);
}
if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
topo_mod_dprintf(mod, "ioctl 2 on '%s' failed: %s\n", devctl,
strerror(errno));
topo_mod_free(mod, di, disz);
! (void) close(fd);
! return (-1);
}
- err = -1;
for (i = 0; i < gdi.DiskCount; i++) {
if (di[i].Enclosure == enclosure && di[i].Slot == slot) {
char sas[17]; /* 16 hex digits and NUL */
(void) snprintf(sas, 17, "%llx", di[i].SasAddress);
topo_mod_dprintf(mod, "found mpt_sas disk (%d/%d) "
"with adddress %s\n", enclosure, slot, sas);
*sas_address = topo_mod_strdup(mod, sas);
! err = 0;
break;
}
}
topo_mod_free(mod, di, disz);
(void) close(fd);
! return (err);
}
int
disk_mptsas_find_disk(topo_mod_t *mod, tnode_t *baynode, char **sas_address)
{
--- 32,108 ----
#include "disk.h"
#include "disk_drivers.h"
/*
* Request the SAS address of the disk (if any) attached to this mpt_sas
! * instance at (Enclosure Number, Slot Number). The function returns
! * -1 on error and sets errno to ENOENT _only_ if the /devices node
! * (*devctl) does not exist.
*/
static int
get_sas_address(topo_mod_t *mod, char *devctl, uint32_t enclosure,
uint32_t slot, char **sas_address)
{
! int ret = -1, en = ENXIO;
! int fd, i;
mptsas_get_disk_info_t gdi;
mptsas_disk_info_t *di;
size_t disz;
bzero(&gdi, sizeof (gdi));
if ((fd = open(devctl, O_RDWR)) == -1) {
! en = errno;
topo_mod_dprintf(mod, "could not open '%s' for ioctl: %s\n",
devctl, strerror(errno));
! errno = en;
! return (-1);
}
if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
+ if (errno != ENOENT)
+ en = errno;
topo_mod_dprintf(mod, "ioctl 1 on '%s' failed: %s\n", devctl,
strerror(errno));
! goto out;
}
gdi.DiskInfoArraySize = disz = sizeof (mptsas_disk_info_t) *
gdi.DiskCount;
gdi.PtrDiskInfoArray = di = topo_mod_alloc(mod, disz);
if (di == NULL) {
topo_mod_dprintf(mod, "memory allocation failed\n");
! en = ENOMEM;
! goto out;
}
if (ioctl(fd, MPTIOCTL_GET_DISK_INFO, &gdi) == -1) {
+ if (errno != ENOENT)
+ en = errno;
topo_mod_dprintf(mod, "ioctl 2 on '%s' failed: %s\n", devctl,
strerror(errno));
topo_mod_free(mod, di, disz);
! goto out;
}
for (i = 0; i < gdi.DiskCount; i++) {
if (di[i].Enclosure == enclosure && di[i].Slot == slot) {
char sas[17]; /* 16 hex digits and NUL */
(void) snprintf(sas, 17, "%llx", di[i].SasAddress);
topo_mod_dprintf(mod, "found mpt_sas disk (%d/%d) "
"with adddress %s\n", enclosure, slot, sas);
*sas_address = topo_mod_strdup(mod, sas);
! en = ret = 0;
break;
}
}
topo_mod_free(mod, di, disz);
+ out:
(void) close(fd);
! errno = en;
! return (ret);
}
int
disk_mptsas_find_disk(topo_mod_t *mod, tnode_t *baynode, char **sas_address)
{
*** 130,159 ****
/*
* devctl is a (potentially) pipe-separated list of different device
* paths to try.
*/
if ((elem = topo_mod_strsplit(mod, devctl, "|", &lastp)) != NULL) {
do {
topo_mod_dprintf(mod, "trying mpt_sas instance at %s\n",
elem);
ret = get_sas_address(mod, elem, enclosure,
slot, sas_address);
- topo_mod_strfree(mod, elem);
-
/*
* Only try further devctl paths from the list if this
* one was not found:
*/
! if (ret != -2) {
! break;
} else {
topo_mod_dprintf(mod, "instance not found\n");
}
! } while ((elem = topo_mod_strsplit(mod, NULL, "|",
&lastp)) != NULL);
}
topo_mod_strfree(mod, devctl);
return (ret);
--- 132,162 ----
/*
* devctl is a (potentially) pipe-separated list of different device
* paths to try.
*/
if ((elem = topo_mod_strsplit(mod, devctl, "|", &lastp)) != NULL) {
+ boolean_t done = B_FALSE;
do {
topo_mod_dprintf(mod, "trying mpt_sas instance at %s\n",
elem);
ret = get_sas_address(mod, elem, enclosure,
slot, sas_address);
/*
* Only try further devctl paths from the list if this
* one was not found:
*/
! if (ret == 0 || errno != ENOENT) {
! done = B_TRUE;
} else {
topo_mod_dprintf(mod, "instance not found\n");
}
! topo_mod_strfree(mod, elem);
!
! } while (!done && (elem = topo_mod_strsplit(mod, NULL, "|",
&lastp)) != NULL);
}
topo_mod_strfree(mod, devctl);
return (ret);