return ret;
}
-static ssize_t
-make_pci_path(uint8_t *buf, size_t size, int fd, struct disk_info *info,
- char *devpath)
-{
- ssize_t ret=-1;
- ssize_t off=0, sz;
-
- /*
- * We're probably on a modern kernel, so just parse the
- * symlink from /sys/dev/block/$major:$minor and get it
- * from there.
- */
- sz = eb_blockdev_pci_fill(buf, size, fd, info);
- if (sz < 0)
- return -1;
- off += sz;
-
- if (info->interface_type == nvme) {
- uint32_t ns_id=0;
- int rc = eb_nvme_ns_id(fd, &ns_id);
- if (rc < 0)
- goto err;
-
- sz = efidp_make_nvme(buf+off, size?size-off:0,
- ns_id, NULL);
- if (sz < 0)
- goto err;
- off += sz;
- }
- ret = off;
- errno = 0;
-err:
- return ret;
-}
-
static int
open_disk(struct disk_info *info, int flags)
{
off = sz;
} else if (!(options & EFIBOOT_ABBREV_FILE)
&& !(options & EFIBOOT_ABBREV_HD)) {
- sz = make_pci_path(buf, size, fd, info, devpath);
+ /*
+ * We're probably on a modern kernel, so just parse the
+ * symlink from /sys/dev/block/$major:$minor and get it
+ * from there.
+ */
+ sz = make_blockdev_path(buf, size, fd, info);
if (sz < 0)
return -1;
- off = sz;
+ off += sz;
}
if (!(options & EFIBOOT_ABBREV_FILE)) {
if (rc <= 0)
return -1;
- rc = sscanf(
- (char *)buf,
- "%d",
- &info->sata_info.ata_port);
+ rc = sscanf((char *)buf, "%d", &info->sata_info.ata_port);
if (rc != 1)
return -1;
int
__attribute__((__visibility__ ("hidden")))
-eb_blockdev_pci_fill(uint8_t *buf, ssize_t size, int fd, struct disk_info *info)
+make_blockdev_path(uint8_t *buf, ssize_t size, int fd, struct disk_info *info)
{
char *linkbuf = NULL;
int loff = 0;
if (!found)
return -1;
+ found = 0;
+
+ if (info->interface_type == interface_type_unknown ||
+ info->interface_type == ata ||
+ info->interface_type == atapi ||
+ info->interface_type == usb ||
+ info->interface_type == i1394 ||
+ info->interface_type == fibre ||
+ info->interface_type == i2o ||
+ info->interface_type == md) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ if (info->interface_type == virtblk) {
+ found = 1;
+ }
+
+ if (info->interface_type == nvme) {
+ uint32_t ns_id=0;
+ int rc = eb_nvme_ns_id(fd, &ns_id);
+ if (rc < 0)
+ return -1;
+
+ sz = efidp_make_nvme(buf+off, size?size-off:0,
+ ns_id, NULL);
+ if (sz < 0)
+ return -1;
+ off += sz;
+ found = 1;
+ }
+
/* /dev/sda as SATA looks like:
* /sys/dev/block/8:0 -> ../../devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda
*/
rc = sysfs_test_sata(linkbuf+loff, PATH_MAX-off);
if (rc < 0)
return -1;
- if (rc > 0) {
+ if (!found && rc > 0) {
ssize_t linksz=0;
rc = sysfs_parse_sata(buf+off, size?size-off:0, &sz,
linkbuf+loff, PATH_MAX-off, &linksz,
return -1;
loff += linksz;
off += sz;
+ found = 1;
}
/* /dev/sdc as SAS looks like:
rc = sysfs_test_sas(linkbuf+loff, PATH_MAX-off, info);
if (rc < 0)
return -1;
- if (rc > 0) {
+ if (!found && rc > 0) {
ssize_t linksz=0;
rc = sysfs_parse_sas(buf+off, size?size-off:0, &sz,
linkbuf+loff, PATH_MAX-off, &linksz,
return -1;
loff += linksz;
off += sz;
+ found = 1;
}
- if (info->interface_type == scsi) {
+ if (!found && info->interface_type == scsi) {
char diskname[PATH_MAX+1]="";
char *linkbuf;
rc = get_disk_name(info->major, info->minor, diskname,
if (sz < 0)
return -1;
off += sz;
+ found = 1;
+ }
+
+ if (!found) {
+ errno = ENOENT;
+ return -1;
}
return off;
extern int eb_disk_info_from_fd(int fd, struct disk_info *info);
extern int get_disk_name(uint64_t major, unsigned char minor,
char *diskname, size_t max);
-extern int eb_blockdev_pci_fill(uint8_t *buf, ssize_t size, int fd,
+extern int make_blockdev_path(uint8_t *buf, ssize_t size, int fd,
struct disk_info *info);
extern int eb_scsi_pci(int fd, const struct disk_info *info, uint8_t *bus,
uint8_t *device, uint8_t *function);