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