grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH RFC] Simplifying linux_find_partition()


From: Pavel Roskin
Subject: [PATCH RFC] Simplifying linux_find_partition()
Date: Sun, 11 May 2008 20:34:33 -0400

Hello!

linux_find_partition() is used to make it possible to access partitions
using the native OS devices for the partitions, rather than the device
for the whole drive.

As new devices are supported by GRUB, linux_find_partition() should be
updated to support them, but this is not always done.  The reason is
that the problem is not obvious and doesn't prevent the basic
functionality.

This patch simplifies the code and makes it handle all devices supported
by Linux, perhaps even all devices that will be supported.

I'm assuming that linux_find_partition() is only called for whole
drives, not for partitions, so the code doesn't need to strip anything
from the device name.  We only need to strip "disc" from devfs names.

Also, I checked devices.txt from Linux, and I see a simple pattern
there.  If the device ends in a number, the partitions are made by
adding "p" and the number.  Otherwise, only the number is added.

ChangeLog:

        * util/biosdisk.c (linux_find_partition): Don't try to handle
        anything but whole drives.  Simplify logic.  Add "p%d" after
        numbers and "%d" after other characters.


diff --git a/util/biosdisk.c b/util/biosdisk.c
index fcf01a4..7079a97 100644
--- a/util/biosdisk.c
+++ b/util/biosdisk.c
@@ -226,40 +226,16 @@ linux_find_partition (char *dev, unsigned long sector)
       p = real_dev + len - 4;
       format = "part%d";
     }
-  else if ((strncmp (real_dev + 5, "hd", 2) == 0
-           || strncmp (real_dev + 5, "vd", 2) == 0
-           || strncmp (real_dev + 5, "sd", 2) == 0)
-          && real_dev[7] >= 'a' && real_dev[7] <= 'z')
+  else if (real_dev[len - 1] >= '0' && real_dev[len - 1] <= '9')
     {
-      p = real_dev + 8;
-      format = "%d";
-    }
-  else if (strncmp (real_dev + 5, "rd/c", 4) == 0)     /* dac960 */
-    {
-      p = strchr (real_dev + 9, 'd');
-      if (! p)
-       return 0;
-
-      p++;
-      while (*p && isdigit (*p))
-       p++;
-
+      p = real_dev + len;
       format = "p%d";
     }
-  else if (strncmp (real_dev + 5, "cciss/c", sizeof("cciss/c")-1) == 0)
+  else
     {
-      p = strchr (real_dev + 5 + sizeof("cciss/c")-1, 'd');
-      if (! p)
-       return 0;
-
-      p++;
-      while (*p && isdigit (*p))
-       p++;
-
-      format = "p%d";
+      p = real_dev + len;
+      format = "%d";
     }
-  else
-    return 0;
 
   for (i = 1; i < 10000; i++)
     {


-- 
Regards,
Pavel Roskin




reply via email to

[Prev in Thread] Current Thread [Next in Thread]