From a1de3862b9c2acd1afdcbd42f79b8b7694a0a794 Mon Sep 17 00:00:00 2001 From: Paulo Flabiano Smorigo Date: Sat, 27 Apr 2013 22:03:13 +0200 Subject: [PATCH 367/471] * util/ieee1275/ofpath.c (of_path_of_scsi): Fix path output for sas disks. (check_sas): Get sas_adress info. --- ChangeLog | 6 ++++ util/ieee1275/ofpath.c | 76 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 66 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 317a367..83cdafc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-04-27 Paulo Flabiano Smorigo + + * util/ieee1275/ofpath.c (of_path_of_scsi): Fix path output for sas + disks. + (check_sas): Get sas_adress info. + 2013-04-27 Vladimir Serbinenko * grub-core/disk/ahci.c (grub_ahci_pciinit): Fix handling of empty diff --git a/util/ieee1275/ofpath.c b/util/ieee1275/ofpath.c index f0a34b5..5fde979 100644 --- a/util/ieee1275/ofpath.c +++ b/util/ieee1275/ofpath.c @@ -324,11 +324,11 @@ vendor_is_ATA(const char *path) } static void -check_sas (char *sysfs_path, int *tgt) +check_sas (char *sysfs_path, int *tgt, unsigned long int *sas_address) { char *ed = strstr (sysfs_path, "end_device"); char *p, *q, *path; - char phy[16]; + char phy[21]; int fd; size_t path_size; @@ -348,16 +348,25 @@ check_sas (char *sysfs_path, int *tgt) + sizeof ("%s/sas_device/%s/phy_identifier")); path = xmalloc (path_size); snprintf (path, path_size, "%s/sas_device/%s/phy_identifier", p, ed); - fd = open (path, O_RDONLY); if (fd < 0) grub_util_error (_("cannot open `%s': %s"), path, strerror (errno)); memset (phy, 0, sizeof (phy)); - read (fd, phy, sizeof (phy)); + read (fd, phy, sizeof (phy) - 1); + close (fd); sscanf (phy, "%d", tgt); + snprintf (path, path_size, "%s/sas_device/%s/sas_address", p, ed); + fd = open (path, O_RDONLY); + if (fd < 0) + grub_util_error (_("cannot open `%s': %s"), path, strerror (errno)); + + memset (phy, 0, sizeof (phy)); + read (fd, phy, sizeof (phy) - 1); + sscanf (phy, "%lx", sas_address); + free (path); free (p); close (fd); @@ -370,13 +379,14 @@ of_path_of_scsi(const char *sys_devname __attribute__((unused)), const char *dev { const char *p, *digit_string, *disk_name; int host, bus, tgt, lun; + unsigned long int sas_address; char *sysfs_path, disk[MAX_DISK_CAT - sizeof ("/fp@0,0")]; char *of_path; sysfs_path = block_device_get_sysfs_path_and_link(devicenode); p = get_basename (sysfs_path); sscanf(p, "%d:%d:%d:%d", &host, &bus, &tgt, &lun); - check_sas (sysfs_path, &tgt); + check_sas (sysfs_path, &tgt, &sas_address); if (vendor_is_ATA(sysfs_path)) { @@ -417,18 +427,52 @@ of_path_of_scsi(const char *sys_devname __attribute__((unused)), const char *dev } else { - if (*digit_string == '\0') - { - snprintf(disk, sizeof (disk), "/%s@%x,%d", disk_name, tgt, lun); - } + if (lun == 0) + { + int sas_id = 0; + sas_id = bus << 16 | tgt << 8 | lun; + + if (*digit_string == '\0') + { + snprintf(disk, sizeof (disk), "/sas/%s@%x", disk_name, sas_id); + } + else + { + int part; + + sscanf(digit_string, "%d", &part); + snprintf(disk, sizeof (disk), + "/sas/%s@%x:%c", disk_name, sas_id, 'a' + (part - 1)); + } + } else - { - int part; - - sscanf(digit_string, "%d", &part); - snprintf(disk, sizeof (disk), - "/%s@%x,%d:%c", disk_name, tgt, lun, 'a' + (part - 1)); - } + { + char *lunstr; + int lunpart[4]; + + lunstr = xmalloc (20); + + lunpart[0] = (lun >> 8) & 0xff; + lunpart[1] = lun & 0xff; + lunpart[2] = (lun >> 24) & 0xff; + lunpart[3] = (lun >> 16) & 0xff; + + sprintf(lunstr, "%02x%02x%02x%02x00000000", lunpart[0], lunpart[1], lunpart[2], lunpart[3]); + long int longlun = atol(lunstr); + + if (*digit_string == '\0') + { + snprintf(disk, sizeof (disk), "/sas/%s@%lx,%lu", disk_name, sas_address, longlun); + } + else + { + int part; + + sscanf(digit_string, "%d", &part); + snprintf(disk, sizeof (disk), + "/sas/%s@%lx,%lu:%c", disk_name, sas_address, longlun, 'a' + (part - 1)); + } + } } strcat(of_path, disk); return of_path; -- 1.8.2.1