Quoting Paulo Flabiano Smorigo/Brazil/IBM <[email protected]>:

Hello all,

I found wrong outputs for some sas devices then I made this patch in order to fix it. Bellow are the outputs using my patch:

grub-probe -t ieee1275_hints -d /dev/sda
ieee1275//pci@800000020000200/pci@2/pci1014\,02BD@1/disk@200

grub-probe -t ieee1275_hints -d /dev/sdb
ieee1275//pci@800000020000200/pci@2/pci1014\,02BD@1/disk@300

grub-probe -t ieee1275_hints -d /dev/sdf
ieee1275//pci@800000020000204/pci1000\,72@0/sas/disk@50080e5234006000\,1000000000000

grub-probe -t ieee1275_hints -d /dev/sdh
ieee1275//pci@800000020000204/pci1000\,72@0/sas/disk@50080e5234006000\,3000000000000


I checked it against openfirmware and all of them were right now. Please, let me know if you find a disk with a wrong ofw output.

--
Paulo Flabiano Smorigo
Software Engineer
Linux Technology Center - IBM Systems & Technology Group

Hello again,

I forgot to add "sas" in the disk path. The first and second path from example should output:

ieee1275//pci@800000020000200/pci@2/pci1014\,02BD@1/sas/disk@200
ieee1275//pci@800000020000200/pci@2/pci1014\,02BD@1/sas/disk@300

Second version of patch fixed it.

--
Paulo Flabiano Smorigo
Software Engineer
Linux Technology Center - IBM Systems & Technology Group
=== modified file 'ChangeLog'
--- ChangeLog	2013-04-17 17:08:31 +0000
+++ ChangeLog	2013-04-19 00:48:38 +0000
@@ -1,3 +1,9 @@
+2013-04-18  Paulo Flabiano Smorigo <[email protected]>
+
+	* util/ieee1275/ofpath.c (of_path_of_scsi): Fix path output for sas
+	disks.
+	* util/ieee1275/ofpath.c (check_sas): Get sas_adress info.
+
 2013-04-17  Vladimir Serbinenko  <[email protected]>
 
 	* util/grub-mkrescue.in: Add GPT for EFI boot.

=== modified file 'util/ieee1275/ofpath.c'
--- util/ieee1275/ofpath.c	2013-01-13 21:45:16 +0000
+++ util/ieee1275/ofpath.c	2013-04-19 16:01:44 +0000
@@ -324,11 +324,11 @@
 }
 
 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[20];
   int fd;
   size_t path_size;
 
@@ -348,16 +348,25 @@
 	       + 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));
+  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));
+  *sas_address = strtoul (phy, NULL, 16);
+
   free (path);
   free (p);
   close (fd);
@@ -370,13 +379,14 @@
 {
   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 @@
     }
   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;

_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to