diff -ru grub-0.96-orig/lib/device.c grub-0.96/lib/device.c
--- grub-0.96-orig/lib/device.c	2005-02-16 22:33:09.669384408 -0600
+++ grub-0.96/lib/device.c	2005-02-17 00:47:05.127596672 -0600
@@ -407,6 +407,12 @@
 {
   sprintf (name, "/dev/ataraid/d%c", unit + '0');
 }
+
+static void
+get_i2o_disk_name (char *name, int unit)
+{
+  sprintf (name, "/dev/i2o/hd%c", unit + 'a');
+}
 #endif
 
 /* Check if DEVICE can be read. If an error occurs, return zero,
@@ -798,6 +804,26 @@
 	  }
       }
   }
+
+  /* I2O disks.  */
+  for (i = 0; i < 8; i++)
+    {
+      char name[16];
+
+      get_i2o_disk_name (name, i);
+      if (check_device (name))
+   {
+     (*map)[num_hd + 0x80] = strdup (name);
+     assert ((*map)[num_hd + 0x80]);
+
+     /* If the device map file is opened, write the map.  */
+     if (fp)
+       fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
+
+     num_hd++;
+   }
+    }
+
 #endif /* __linux__ */
   
   /* OK, close the device map file if opened.  */
@@ -858,8 +884,15 @@
       if (strcmp (dev + strlen(dev) - 5, "/disc") == 0)
 	strcpy (dev + strlen(dev) - 5, "/part");
     }
-  sprintf (dev + strlen(dev), "%d", ((partition >> 16) & 0xFF) + 1);
-  
+  sprintf (dev + strlen(dev), "%s%d", 
+    /* Compaq smart and others */
+    (strncmp(dev, "/dev/ida/", 9) == 0 ||
+    strncmp(dev, "/dev/ataraid/", 13) == 0 ||
+    strncmp(dev, "/dev/cciss/", 11) == 0 ||
+    strncmp(dev, "/dev/rd/", 8) == 0 ||
+    strncmp(dev, "/dev/i2o/", 9) == 0) ? "p" : "",
+   ((partition >> 16) & 0xFF) + 1);
+   
   /* Open the partition.  */
   fd = open (dev, O_RDWR);
   if (fd < 0)
