aboutsummaryrefslogtreecommitdiffstats
path: root/init/do_mounts.c
diff options
context:
space:
mode:
Diffstat (limited to 'init/do_mounts.c')
-rw-r--r--init/do_mounts.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/init/do_mounts.c b/init/do_mounts.c
index f8a66424360d..b28ec5819325 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -69,23 +69,28 @@ __setup("ro", readonly);
69__setup("rw", readwrite); 69__setup("rw", readwrite);
70 70
71#ifdef CONFIG_BLOCK 71#ifdef CONFIG_BLOCK
72struct uuidcmp {
73 const char *uuid;
74 int len;
75};
76
72/** 77/**
73 * match_dev_by_uuid - callback for finding a partition using its uuid 78 * match_dev_by_uuid - callback for finding a partition using its uuid
74 * @dev: device passed in by the caller 79 * @dev: device passed in by the caller
75 * @data: opaque pointer to a 36 byte char array with a UUID 80 * @data: opaque pointer to the desired struct uuidcmp to match
76 * 81 *
77 * Returns 1 if the device matches, and 0 otherwise. 82 * Returns 1 if the device matches, and 0 otherwise.
78 */ 83 */
79static int match_dev_by_uuid(struct device *dev, void *data) 84static int match_dev_by_uuid(struct device *dev, void *data)
80{ 85{
81 u8 *uuid = data; 86 struct uuidcmp *cmp = data;
82 struct hd_struct *part = dev_to_part(dev); 87 struct hd_struct *part = dev_to_part(dev);
83 88
84 if (!part->info) 89 if (!part->info)
85 goto no_match; 90 goto no_match;
86 91
87 if (memcmp(uuid, part->info->uuid, sizeof(part->info->uuid))) 92 if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len))
88 goto no_match; 93 goto no_match;
89 94
90 return 1; 95 return 1;
91no_match: 96no_match:
@@ -95,7 +100,7 @@ no_match:
95 100
96/** 101/**
97 * devt_from_partuuid - looks up the dev_t of a partition by its UUID 102 * devt_from_partuuid - looks up the dev_t of a partition by its UUID
98 * @uuid: min 36 byte char array containing a hex ascii UUID 103 * @uuid: char array containing ascii UUID
99 * 104 *
100 * The function will return the first partition which contains a matching 105 * The function will return the first partition which contains a matching
101 * UUID value in its partition_meta_info struct. This does not search 106 * UUID value in its partition_meta_info struct. This does not search
@@ -106,11 +111,11 @@ no_match:
106 * 111 *
107 * Returns the matching dev_t on success or 0 on failure. 112 * Returns the matching dev_t on success or 0 on failure.
108 */ 113 */
109static dev_t devt_from_partuuid(char *uuid_str) 114static dev_t devt_from_partuuid(const char *uuid_str)
110{ 115{
111 dev_t res = 0; 116 dev_t res = 0;
117 struct uuidcmp cmp;
112 struct device *dev = NULL; 118 struct device *dev = NULL;
113 u8 uuid[16];
114 struct gendisk *disk; 119 struct gendisk *disk;
115 struct hd_struct *part; 120 struct hd_struct *part;
116 int offset = 0; 121 int offset = 0;
@@ -118,6 +123,9 @@ static dev_t devt_from_partuuid(char *uuid_str)
118 if (strlen(uuid_str) < 36) 123 if (strlen(uuid_str) < 36)
119 goto done; 124 goto done;
120 125
126 cmp.uuid = uuid_str;
127 cmp.len = 36;
128
121 /* Check for optional partition number offset attributes. */ 129 /* Check for optional partition number offset attributes. */
122 if (uuid_str[36]) { 130 if (uuid_str[36]) {
123 char c = 0; 131 char c = 0;
@@ -134,10 +142,8 @@ static dev_t devt_from_partuuid(char *uuid_str)
134 } 142 }
135 } 143 }
136 144
137 /* Pack the requested UUID in the expected format. */ 145 dev = class_find_device(&block_class, NULL, &cmp,
138 part_pack_uuid(uuid_str, uuid); 146 &match_dev_by_uuid);
139
140 dev = class_find_device(&block_class, NULL, uuid, &match_dev_by_uuid);
141 if (!dev) 147 if (!dev)
142 goto done; 148 goto done;
143 149