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);