]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - init/do_mounts.c
USB: option: Add new MEDIATEK PID support
[karo-tx-linux.git] / init / do_mounts.c
index f8a66424360d22803b2c20b906ada8faa0d2a48d..1d1b6348f903c8e517567794765120d3dfa16d16 100644 (file)
@@ -69,23 +69,28 @@ __setup("ro", readonly);
 __setup("rw", readwrite);
 
 #ifdef CONFIG_BLOCK
+struct uuidcmp {
+       const char *uuid;
+       int len;
+};
+
 /**
  * match_dev_by_uuid - callback for finding a partition using its uuid
  * @dev:       device passed in by the caller
- * @data:      opaque pointer to a 36 byte char array with a UUID
+ * @data:      opaque pointer to the desired struct uuidcmp to match
  *
  * Returns 1 if the device matches, and 0 otherwise.
  */
 static int match_dev_by_uuid(struct device *dev, void *data)
 {
-       u8 *uuid = data;
+       struct uuidcmp *cmp = data;
        struct hd_struct *part = dev_to_part(dev);
 
        if (!part->info)
                goto no_match;
 
-       if (memcmp(uuid, part->info->uuid, sizeof(part->info->uuid)))
-                       goto no_match;
+       if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len))
+               goto no_match;
 
        return 1;
 no_match:
@@ -95,7 +100,7 @@ no_match:
 
 /**
  * devt_from_partuuid - looks up the dev_t of a partition by its UUID
- * @uuid:      min 36 byte char array containing a hex ascii UUID
+ * @uuid:      char array containing ascii UUID
  *
  * The function will return the first partition which contains a matching
  * UUID value in its partition_meta_info struct.  This does not search
@@ -106,38 +111,41 @@ no_match:
  *
  * Returns the matching dev_t on success or 0 on failure.
  */
-static dev_t devt_from_partuuid(char *uuid_str)
+static dev_t devt_from_partuuid(const char *uuid_str)
 {
        dev_t res = 0;
+       struct uuidcmp cmp;
        struct device *dev = NULL;
-       u8 uuid[16];
        struct gendisk *disk;
        struct hd_struct *part;
        int offset = 0;
+       bool clear_root_wait = false;
+       char *slash;
 
-       if (strlen(uuid_str) < 36)
-               goto done;
+       cmp.uuid = uuid_str;
 
+       slash = strchr(uuid_str, '/');
        /* Check for optional partition number offset attributes. */
-       if (uuid_str[36]) {
+       if (slash) {
                char c = 0;
                /* Explicitly fail on poor PARTUUID syntax. */
-               if (sscanf(&uuid_str[36],
-                          "/PARTNROFF=%d%c", &offset, &c) != 1) {
-                       printk(KERN_ERR "VFS: PARTUUID= is invalid.\n"
-                        "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
-                       if (root_wait)
-                               printk(KERN_ERR
-                                    "Disabling rootwait; root= is invalid.\n");
-                       root_wait = 0;
+               if (sscanf(slash + 1,
+                          "PARTNROFF=%d%c", &offset, &c) != 1) {
+                       clear_root_wait = true;
                        goto done;
                }
+               cmp.len = slash - uuid_str;
+       } else {
+               cmp.len = strlen(uuid_str);
        }
 
-       /* Pack the requested UUID in the expected format. */
-       part_pack_uuid(uuid_str, uuid);
+       if (!cmp.len) {
+               clear_root_wait = true;
+               goto done;
+       }
 
-       dev = class_find_device(&block_class, NULL, uuid, &match_dev_by_uuid);
+       dev = class_find_device(&block_class, NULL, &cmp,
+                               &match_dev_by_uuid);
        if (!dev)
                goto done;
 
@@ -158,6 +166,13 @@ static dev_t devt_from_partuuid(char *uuid_str)
 no_offset:
        put_device(dev);
 done:
+       if (clear_root_wait) {
+               pr_err("VFS: PARTUUID= is invalid.\n"
+                      "Expected PARTUUID=<valid-uuid-id>[/PARTNROFF=%%d]\n");
+               if (root_wait)
+                       pr_err("Disabling rootwait; root= is invalid.\n");
+               root_wait = 0;
+       }
        return res;
 }
 #endif
@@ -174,6 +189,10 @@ done:
  *        used when disk name of partitioned disk ends on a digit.
  *     6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the
  *        unique id of a partition if the partition table provides it.
+ *        The UUID may be either an EFI/GPT UUID, or refer to an MSDOS
+ *        partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero-
+ *        filled hex representation of the 32-bit "NT disk signature", and PP
+ *        is a zero-filled hex representation of the 1-based partition number.
  *     7) PARTUUID=<UUID>/PARTNROFF=<int> to select a partition in relation to
  *        a partition with a known unique id.
  *