~darkmuggle-deactivatedaccount/ubuntu/quantal/grub2/fix-872244

« back to all changes in this revision

Viewing changes to grub-core/disk/raid.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2011-05-17 23:59:10 UTC
  • mto: (17.3.55 sid)
  • mto: This revision was merged to the branch mainline in revision 122.
  • Revision ID: james.westby@ubuntu.com-20110517235910-ma8u889vyjdfro27
Tags: upstream-1.99
ImportĀ upstreamĀ versionĀ 1.99

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
#include <grub/err.h>
24
24
#include <grub/misc.h>
25
25
#include <grub/raid.h>
 
26
#ifdef GRUB_UTIL
 
27
#include <grub/util/misc.h>
 
28
#endif
 
29
 
 
30
GRUB_MOD_LICENSE ("GPLv3+");
26
31
 
27
32
/* Linked list of RAID arrays. */
28
33
static struct grub_raid_array *array_list;
117
122
}
118
123
#endif
119
124
 
 
125
static inline int
 
126
ascii2hex (char c)
 
127
{
 
128
  if (c >= '0' && c <= '9')
 
129
    return c - '0';
 
130
  if (c >= 'a' && c <= 'f')
 
131
    return c - 'a' + 10;
 
132
  if (c >= 'A' && c <= 'F')
 
133
    return c - 'A' + 10;
 
134
  return 0;
 
135
}
 
136
 
120
137
static grub_err_t
121
138
grub_raid_open (const char *name, grub_disk_t disk)
122
139
{
123
140
  struct grub_raid_array *array;
124
141
  unsigned n;
125
142
 
126
 
  for (array = array_list; array != NULL; array = array->next)
 
143
  if (grub_memcmp (name, "mduuid/", sizeof ("mduuid/") - 1) == 0)
127
144
    {
128
 
      if (!grub_strcmp (array->name, name))
129
 
        if (grub_is_array_readable (array))
130
 
          break;
 
145
      const char *uuidstr = name + sizeof ("mduuid/") - 1;
 
146
      grub_size_t uuid_len = grub_strlen (uuidstr) / 2;
 
147
      grub_uint8_t uuidbin[uuid_len];
 
148
      unsigned i;
 
149
      for (i = 0; i < uuid_len; i++)
 
150
        uuidbin[i] = ascii2hex (uuidstr[2 * i + 1])
 
151
          | (ascii2hex (uuidstr[2 * i]) << 4);
 
152
      
 
153
      for (array = array_list; array != NULL; array = array->next)
 
154
        {
 
155
          if (uuid_len == (unsigned) array->uuid_len
 
156
              && grub_memcmp (uuidbin, array->uuid, uuid_len) == 0)
 
157
            if (grub_is_array_readable (array))
 
158
              break;
 
159
        }
131
160
    }
 
161
  else
 
162
    for (array = array_list; array != NULL; array = array->next)
 
163
      {
 
164
        if (!grub_strcmp (array->name, name))
 
165
          if (grub_is_array_readable (array))
 
166
            break;
 
167
      }
132
168
 
133
169
  if (!array)
134
170
    return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown RAID device %s",
570
606
        {
571
607
          for (p = array_list; p != NULL; p = p->next)
572
608
            {
573
 
              if (! p->name && p->number == array->number) 
 
609
              if (p->number == array->number) 
574
610
                break;
575
611
            }
576
612
        }
638
674
 
639
675
      grub_dprintf ("raid", "Found array %s (%s)\n", array->name,
640
676
                    scanner_name);
 
677
#ifdef GRUB_UTIL
 
678
      grub_util_info ("Found array %s (%s)", array->name,
 
679
                      scanner_name);
 
680
#endif
641
681
 
642
682
      /* Add our new array to the list.  */
643
683
      array->next = array_list;
696
736
      struct grub_raid_array array;
697
737
      grub_disk_addr_t start_sector;
698
738
 
699
 
      grub_dprintf ("raid", "Scanning for RAID devices on disk %s\n", name);
 
739
      grub_dprintf ("raid", "Scanning for %s RAID devices on disk %s\n",
 
740
                    grub_raid_list->name, name);
 
741
#ifdef GRUB_UTIL
 
742
      grub_util_info ("Scanning for %s RAID devices on disk %s",
 
743
                      grub_raid_list->name, name);
 
744
#endif
700
745
 
701
746
      disk = grub_disk_open (name);
702
747
      if (!disk)