linux/fs/partitions/efi.c
<<
>>
Prefs
   1/************************************************************
   2 * EFI GUID Partition Table handling
   3 * Per Intel EFI Specification v1.02
   4 * http://developer.intel.com/technology/efi/efi.htm
   5 * efi.[ch] by Matt Domsch <Matt_Domsch@dell.com>
   6 *   Copyright 2000,2001,2002,2004 Dell Inc.
   7 *
   8 *  This program is free software; you can redistribute it and/or modify
   9 *  it under the terms of the GNU General Public License as published by
  10 *  the Free Software Foundation; either version 2 of the License, or
  11 *  (at your option) any later version.
  12 *
  13 *  This program is distributed in the hope that it will be useful,
  14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 *  GNU General Public License for more details.
  17 *
  18 *  You should have received a copy of the GNU General Public License
  19 *  along with this program; if not, write to the Free Software
  20 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21 *
  22 *
  23 * TODO:
  24 *
  25 * Changelog:
  26 * Mon Nov 09 2004 Matt Domsch <Matt_Domsch@dell.com>
  27 * - test for valid PMBR and valid PGPT before ever reading
  28 *   AGPT, allow override with 'gpt' kernel command line option.
  29 * - check for first/last_usable_lba outside of size of disk
  30 *
  31 * Tue  Mar 26 2002 Matt Domsch <Matt_Domsch@dell.com>
  32 * - Ported to 2.5.7-pre1 and 2.5.7-dj2
  33 * - Applied patch to avoid fault in alternate header handling
  34 * - cleaned up find_valid_gpt
  35 * - On-disk structure and copy in memory is *always* LE now - 
  36 *   swab fields as needed
  37 * - remove print_gpt_header()
  38 * - only use first max_p partition entries, to keep the kernel minor number
  39 *   and partition numbers tied.
  40 *
  41 * Mon  Feb 04 2002 Matt Domsch <Matt_Domsch@dell.com>
  42 * - Removed __PRIPTR_PREFIX - not being used
  43 *
  44 * Mon  Jan 14 2002 Matt Domsch <Matt_Domsch@dell.com>
  45 * - Ported to 2.5.2-pre11 + library crc32 patch Linus applied
  46 *
  47 * Thu Dec 6 2001 Matt Domsch <Matt_Domsch@dell.com>
  48 * - Added compare_gpts().
  49 * - moved le_efi_guid_to_cpus() back into this file.  GPT is the only
  50 *   thing that keeps EFI GUIDs on disk.
  51 * - Changed gpt structure names and members to be simpler and more Linux-like.
  52 * 
  53 * Wed Oct 17 2001 Matt Domsch <Matt_Domsch@dell.com>
  54 * - Removed CONFIG_DEVFS_VOLUMES_UUID code entirely per Martin Wilck
  55 *
  56 * Wed Oct 10 2001 Matt Domsch <Matt_Domsch@dell.com>
  57 * - Changed function comments to DocBook style per Andreas Dilger suggestion.
  58 *
  59 * Mon Oct 08 2001 Matt Domsch <Matt_Domsch@dell.com>
  60 * - Change read_lba() to use the page cache per Al Viro's work.
  61 * - print u64s properly on all architectures
  62 * - fixed debug_printk(), now Dprintk()
  63 *
  64 * Mon Oct 01 2001 Matt Domsch <Matt_Domsch@dell.com>
  65 * - Style cleanups
  66 * - made most functions static
  67 * - Endianness addition
  68 * - remove test for second alternate header, as it's not per spec,
  69 *   and is unnecessary.  There's now a method to read/write the last
  70 *   sector of an odd-sized disk from user space.  No tools have ever
  71 *   been released which used this code, so it's effectively dead.
  72 * - Per Asit Mallick of Intel, added a test for a valid PMBR.
  73 * - Added kernel command line option 'gpt' to override valid PMBR test.
  74 *
  75 * Wed Jun  6 2001 Martin Wilck <Martin.Wilck@Fujitsu-Siemens.com>
  76 * - added devfs volume UUID support (/dev/volumes/uuids) for
  77 *   mounting file systems by the partition GUID. 
  78 *
  79 * Tue Dec  5 2000 Matt Domsch <Matt_Domsch@dell.com>
  80 * - Moved crc32() to linux/lib, added efi_crc32().
  81 *
  82 * Thu Nov 30 2000 Matt Domsch <Matt_Domsch@dell.com>
  83 * - Replaced Intel's CRC32 function with an equivalent
  84 *   non-license-restricted version.
  85 *
  86 * Wed Oct 25 2000 Matt Domsch <Matt_Domsch@dell.com>
  87 * - Fixed the last_lba() call to return the proper last block
  88 *
  89 * Thu Oct 12 2000 Matt Domsch <Matt_Domsch@dell.com>
  90 * - Thanks to Andries Brouwer for his debugging assistance.
  91 * - Code works, detects all the partitions.
  92 *
  93 ************************************************************/
  94#include <linux/crc32.h>
  95#include "check.h"
  96#include "efi.h"
  97
  98/* This allows a kernel command line option 'gpt' to override
  99 * the test for invalid PMBR.  Not __initdata because reloading
 100 * the partition tables happens after init too.
 101 */
 102static int force_gpt;
 103static int __init
 104force_gpt_fn(char *str)
 105{
 106        force_gpt = 1;
 107        return 1;
 108}
 109__setup("gpt", force_gpt_fn);
 110
 111
 112/**
 113 * efi_crc32() - EFI version of crc32 function
 114 * @buf: buffer to calculate crc32 of
 115 * @len - length of buf
 116 *
 117 * Description: Returns EFI-style CRC32 value for @buf
 118 * 
 119 * This function uses the little endian Ethernet polynomial
 120 * but seeds the function with ~0, and xor's with ~0 at the end.
 121 * Note, the EFI Specification, v1.02, has a reference to
 122 * Dr. Dobbs Journal, May 1994 (actually it's in May 1992).
 123 */
 124static inline u32
 125efi_crc32(const void *buf, unsigned long len)
 126{
 127        return (crc32(~0L, buf, len) ^ ~0L);
 128}
 129
 130/**
 131 * last_lba(): return number of last logical block of device
 132 * @bdev: block device
 133 * 
 134 * Description: Returns last LBA value on success, 0 on error.
 135 * This is stored (by sd and ide-geometry) in
 136 *  the part[0] entry for this disk, and is the number of
 137 *  physical sectors available on the disk.
 138 */
 139static u64
 140last_lba(struct block_device *bdev)
 141{
 142        if (!bdev || !bdev->bd_inode)
 143                return 0;
 144        return (bdev->bd_inode->i_size >> 9) - 1ULL;
 145}
 146
 147static inline int
 148pmbr_part_valid(struct partition *part)
 149{
 150        if (part->sys_ind == EFI_PMBR_OSTYPE_EFI_GPT &&
 151            le32_to_cpu(part->start_sect) == 1UL)
 152                return 1;
 153        return 0;
 154}
 155
 156/**
 157 * is_pmbr_valid(): test Protective MBR for validity
 158 * @mbr: pointer to a legacy mbr structure
 159 *
 160 * Description: Returns 1 if PMBR is valid, 0 otherwise.
 161 * Validity depends on two things:
 162 *  1) MSDOS signature is in the last two bytes of the MBR
 163 *  2) One partition of type 0xEE is found
 164 */
 165static int
 166is_pmbr_valid(legacy_mbr *mbr)
 167{
 168        int i;
 169        if (!mbr || le16_to_cpu(mbr->signature) != MSDOS_MBR_SIGNATURE)
 170                return 0;
 171        for (i = 0; i < 4; i++)
 172                if (pmbr_part_valid(&mbr->partition_record[i]))
 173                        return 1;
 174        return 0;
 175}
 176
 177/**
 178 * read_lba(): Read bytes from disk, starting at given LBA
 179 * @bdev
 180 * @lba
 181 * @buffer
 182 * @size_t
 183 *
 184 * Description:  Reads @count bytes from @bdev into @buffer.
 185 * Returns number of bytes read on success, 0 on error.
 186 */
 187static size_t
 188read_lba(struct block_device *bdev, u64 lba, u8 * buffer, size_t count)
 189{
 190        size_t totalreadcount = 0;
 191
 192        if (!bdev || !buffer || lba > last_lba(bdev))
 193                return 0;
 194
 195        while (count) {
 196                int copied = 512;
 197                Sector sect;
 198                unsigned char *data = read_dev_sector(bdev, lba++, &sect);
 199                if (!data)
 200                        break;
 201                if (copied > count)
 202                        copied = count;
 203                memcpy(buffer, data, copied);
 204                put_dev_sector(sect);
 205                buffer += copied;
 206                totalreadcount +=copied;
 207                count -= copied;
 208        }
 209        return totalreadcount;
 210}
 211
 212/**
 213 * alloc_read_gpt_entries(): reads partition entries from disk
 214 * @bdev
 215 * @gpt - GPT header
 216 * 
 217 * Description: Returns ptes on success,  NULL on error.
 218 * Allocates space for PTEs based on information found in @gpt.
 219 * Notes: remember to free pte when you're done!
 220 */
 221static gpt_entry *
 222alloc_read_gpt_entries(struct block_device *bdev, gpt_header *gpt)
 223{
 224        size_t count;
 225        gpt_entry *pte;
 226        if (!bdev || !gpt)
 227                return NULL;
 228
 229        count = le32_to_cpu(gpt->num_partition_entries) *
 230                le32_to_cpu(gpt->sizeof_partition_entry);
 231        if (!count)
 232                return NULL;
 233        pte = kzalloc(count, GFP_KERNEL);
 234        if (!pte)
 235                return NULL;
 236
 237        if (read_lba(bdev, le64_to_cpu(gpt->partition_entry_lba),
 238                     (u8 *) pte,
 239                     count) < count) {
 240                kfree(pte);
 241                pte=NULL;
 242                return NULL;
 243        }
 244        return pte;
 245}
 246
 247/**
 248 * alloc_read_gpt_header(): Allocates GPT header, reads into it from disk
 249 * @bdev
 250 * @lba is the Logical Block Address of the partition table
 251 * 
 252 * Description: returns GPT header on success, NULL on error.   Allocates
 253 * and fills a GPT header starting at @ from @bdev.
 254 * Note: remember to free gpt when finished with it.
 255 */
 256static gpt_header *
 257alloc_read_gpt_header(struct block_device *bdev, u64 lba)
 258{
 259        gpt_header *gpt;
 260        if (!bdev)
 261                return NULL;
 262
 263        gpt = kzalloc(sizeof (gpt_header), GFP_KERNEL);
 264        if (!gpt)
 265                return NULL;
 266
 267        if (read_lba(bdev, lba, (u8 *) gpt,
 268                     sizeof (gpt_header)) < sizeof (gpt_header)) {
 269                kfree(gpt);
 270                gpt=NULL;
 271                return NULL;
 272        }
 273
 274        return gpt;
 275}
 276
 277/**
 278 * is_gpt_valid() - tests one GPT header and PTEs for validity
 279 * @bdev
 280 * @lba is the logical block address of the GPT header to test
 281 * @gpt is a GPT header ptr, filled on return.
 282 * @ptes is a PTEs ptr, filled on return.
 283 *
 284 * Description: returns 1 if valid,  0 on error.
 285 * If valid, returns pointers to newly allocated GPT header and PTEs.
 286 */
 287static int
 288is_gpt_valid(struct block_device *bdev, u64 lba,
 289             gpt_header **gpt, gpt_entry **ptes)
 290{
 291        u32 crc, origcrc;
 292        u64 lastlba;
 293
 294        if (!bdev || !gpt || !ptes)
 295                return 0;
 296        if (!(*gpt = alloc_read_gpt_header(bdev, lba)))
 297                return 0;
 298
 299        /* Check the GUID Partition Table signature */
 300        if (le64_to_cpu((*gpt)->signature) != GPT_HEADER_SIGNATURE) {
 301                pr_debug("GUID Partition Table Header signature is wrong:"
 302                         "%lld != %lld\n",
 303                         (unsigned long long)le64_to_cpu((*gpt)->signature),
 304                         (unsigned long long)GPT_HEADER_SIGNATURE);
 305                goto fail;
 306        }
 307
 308        /* Check the GUID Partition Table CRC */
 309        origcrc = le32_to_cpu((*gpt)->header_crc32);
 310        (*gpt)->header_crc32 = 0;
 311        crc = efi_crc32((const unsigned char *) (*gpt), le32_to_cpu((*gpt)->header_size));
 312
 313        if (crc != origcrc) {
 314                pr_debug("GUID Partition Table Header CRC is wrong: %x != %x\n",
 315                         crc, origcrc);
 316                goto fail;
 317        }
 318        (*gpt)->header_crc32 = cpu_to_le32(origcrc);
 319
 320        /* Check that the my_lba entry points to the LBA that contains
 321         * the GUID Partition Table */
 322        if (le64_to_cpu((*gpt)->my_lba) != lba) {
 323                pr_debug("GPT my_lba incorrect: %lld != %lld\n",
 324                         (unsigned long long)le64_to_cpu((*gpt)->my_lba),
 325                         (unsigned long long)lba);
 326                goto fail;
 327        }
 328
 329        /* Check the first_usable_lba and last_usable_lba are
 330         * within the disk.
 331         */
 332        lastlba = last_lba(bdev);
 333        if (le64_to_cpu((*gpt)->first_usable_lba) > lastlba) {
 334                pr_debug("GPT: first_usable_lba incorrect: %lld > %lld\n",
 335                         (unsigned long long)le64_to_cpu((*gpt)->first_usable_lba),
 336                         (unsigned long long)lastlba);
 337                goto fail;
 338        }
 339        if (le64_to_cpu((*gpt)->last_usable_lba) > lastlba) {
 340                pr_debug("GPT: last_usable_lba incorrect: %lld > %lld\n",
 341                         (unsigned long long)le64_to_cpu((*gpt)->last_usable_lba),
 342                         (unsigned long long)lastlba);
 343                goto fail;
 344        }
 345
 346        if (!(*ptes = alloc_read_gpt_entries(bdev, *gpt)))
 347                goto fail;
 348
 349        /* Check the GUID Partition Entry Array CRC */
 350        crc = efi_crc32((const unsigned char *) (*ptes),
 351                        le32_to_cpu((*gpt)->num_partition_entries) *
 352                        le32_to_cpu((*gpt)->sizeof_partition_entry));
 353
 354        if (crc != le32_to_cpu((*gpt)->partition_entry_array_crc32)) {
 355                pr_debug("GUID Partitition Entry Array CRC check failed.\n");
 356                goto fail_ptes;
 357        }
 358
 359        /* We're done, all's well */
 360        return 1;
 361
 362 fail_ptes:
 363        kfree(*ptes);
 364        *ptes = NULL;
 365 fail:
 366        kfree(*gpt);
 367        *gpt = NULL;
 368        return 0;
 369}
 370
 371/**
 372 * is_pte_valid() - tests one PTE for validity
 373 * @pte is the pte to check
 374 * @lastlba is last lba of the disk
 375 *
 376 * Description: returns 1 if valid,  0 on error.
 377 */
 378static inline int
 379is_pte_valid(const gpt_entry *pte, const u64 lastlba)
 380{
 381        if ((!efi_guidcmp(pte->partition_type_guid, NULL_GUID)) ||
 382            le64_to_cpu(pte->starting_lba) > lastlba         ||
 383            le64_to_cpu(pte->ending_lba)   > lastlba)
 384                return 0;
 385        return 1;
 386}
 387
 388/**
 389 * compare_gpts() - Search disk for valid GPT headers and PTEs
 390 * @pgpt is the primary GPT header
 391 * @agpt is the alternate GPT header
 392 * @lastlba is the last LBA number
 393 * Description: Returns nothing.  Sanity checks pgpt and agpt fields
 394 * and prints warnings on discrepancies.
 395 * 
 396 */
 397static void
 398compare_gpts(gpt_header *pgpt, gpt_header *agpt, u64 lastlba)
 399{
 400        int error_found = 0;
 401        if (!pgpt || !agpt)
 402                return;
 403        if (le64_to_cpu(pgpt->my_lba) != le64_to_cpu(agpt->alternate_lba)) {
 404                printk(KERN_WARNING
 405                       "GPT:Primary header LBA != Alt. header alternate_lba\n");
 406                printk(KERN_WARNING "GPT:%lld != %lld\n",
 407                       (unsigned long long)le64_to_cpu(pgpt->my_lba),
 408                       (unsigned long long)le64_to_cpu(agpt->alternate_lba));
 409                error_found++;
 410        }
 411        if (le64_to_cpu(pgpt->alternate_lba) != le64_to_cpu(agpt->my_lba)) {
 412                printk(KERN_WARNING
 413                       "GPT:Primary header alternate_lba != Alt. header my_lba\n");
 414                printk(KERN_WARNING "GPT:%lld != %lld\n",
 415                       (unsigned long long)le64_to_cpu(pgpt->alternate_lba),
 416                       (unsigned long long)le64_to_cpu(agpt->my_lba));
 417                error_found++;
 418        }
 419        if (le64_to_cpu(pgpt->first_usable_lba) !=
 420            le64_to_cpu(agpt->first_usable_lba)) {
 421                printk(KERN_WARNING "GPT:first_usable_lbas don't match.\n");
 422                printk(KERN_WARNING "GPT:%lld != %lld\n",
 423                       (unsigned long long)le64_to_cpu(pgpt->first_usable_lba),
 424                       (unsigned long long)le64_to_cpu(agpt->first_usable_lba));
 425                error_found++;
 426        }
 427        if (le64_to_cpu(pgpt->last_usable_lba) !=
 428            le64_to_cpu(agpt->last_usable_lba)) {
 429                printk(KERN_WARNING "GPT:last_usable_lbas don't match.\n");
 430                printk(KERN_WARNING "GPT:%lld != %lld\n",
 431                       (unsigned long long)le64_to_cpu(pgpt->last_usable_lba),
 432                       (unsigned long long)le64_to_cpu(agpt->last_usable_lba));
 433                error_found++;
 434        }
 435        if (efi_guidcmp(pgpt->disk_guid, agpt->disk_guid)) {
 436                printk(KERN_WARNING "GPT:disk_guids don't match.\n");
 437                error_found++;
 438        }
 439        if (le32_to_cpu(pgpt->num_partition_entries) !=
 440            le32_to_cpu(agpt->num_partition_entries)) {
 441                printk(KERN_WARNING "GPT:num_partition_entries don't match: "
 442                       "0x%x != 0x%x\n",
 443                       le32_to_cpu(pgpt->num_partition_entries),
 444                       le32_to_cpu(agpt->num_partition_entries));
 445                error_found++;
 446        }
 447        if (le32_to_cpu(pgpt->sizeof_partition_entry) !=
 448            le32_to_cpu(agpt->sizeof_partition_entry)) {
 449                printk(KERN_WARNING
 450                       "GPT:sizeof_partition_entry values don't match: "
 451                       "0x%x != 0x%x\n",
 452                       le32_to_cpu(pgpt->sizeof_partition_entry),
 453                       le32_to_cpu(agpt->sizeof_partition_entry));
 454                error_found++;
 455        }
 456        if (le32_to_cpu(pgpt->partition_entry_array_crc32) !=
 457            le32_to_cpu(agpt->partition_entry_array_crc32)) {
 458                printk(KERN_WARNING
 459                       "GPT:partition_entry_array_crc32 values don't match: "
 460                       "0x%x != 0x%x\n",
 461                       le32_to_cpu(pgpt->partition_entry_array_crc32),
 462                       le32_to_cpu(agpt->partition_entry_array_crc32));
 463                error_found++;
 464        }
 465        if (le64_to_cpu(pgpt->alternate_lba) != lastlba) {
 466                printk(KERN_WARNING
 467                       "GPT:Primary header thinks Alt. header is not at the end of the disk.\n");
 468                printk(KERN_WARNING "GPT:%lld != %lld\n",
 469                        (unsigned long long)le64_to_cpu(pgpt->alternate_lba),
 470                        (unsigned long long)lastlba);
 471                error_found++;
 472        }
 473
 474        if (le64_to_cpu(agpt->my_lba) != lastlba) {
 475                printk(KERN_WARNING
 476                       "GPT:Alternate GPT header not at the end of the disk.\n");
 477                printk(KERN_WARNING "GPT:%lld != %lld\n",
 478                        (unsigned long long)le64_to_cpu(agpt->my_lba),
 479                        (unsigned long long)lastlba);
 480                error_found++;
 481        }
 482
 483        if (error_found)
 484                printk(KERN_WARNING
 485                       "GPT: Use GNU Parted to correct GPT errors.\n");
 486        return;
 487}
 488
 489/**
 490 * find_valid_gpt() - Search disk for valid GPT headers and PTEs
 491 * @bdev
 492 * @gpt is a GPT header ptr, filled on return.
 493 * @ptes is a PTEs ptr, filled on return.
 494 * Description: Returns 1 if valid, 0 on error.
 495 * If valid, returns pointers to newly allocated GPT header and PTEs.
 496 * Validity depends on PMBR being valid (or being overridden by the
 497 * 'gpt' kernel command line option) and finding either the Primary
 498 * GPT header and PTEs valid, or the Alternate GPT header and PTEs
 499 * valid.  If the Primary GPT header is not valid, the Alternate GPT header
 500 * is not checked unless the 'gpt' kernel command line option is passed.
 501 * This protects against devices which misreport their size, and forces
 502 * the user to decide to use the Alternate GPT.
 503 */
 504static int
 505find_valid_gpt(struct block_device *bdev, gpt_header **gpt, gpt_entry **ptes)
 506{
 507        int good_pgpt = 0, good_agpt = 0, good_pmbr = 0;
 508        gpt_header *pgpt = NULL, *agpt = NULL;
 509        gpt_entry *pptes = NULL, *aptes = NULL;
 510        legacy_mbr *legacymbr;
 511        u64 lastlba;
 512        if (!bdev || !gpt || !ptes)
 513                return 0;
 514
 515        lastlba = last_lba(bdev);
 516        if (!force_gpt) {
 517                /* This will be added to the EFI Spec. per Intel after v1.02. */
 518                legacymbr = kzalloc(sizeof (*legacymbr), GFP_KERNEL);
 519                if (legacymbr) {
 520                        read_lba(bdev, 0, (u8 *) legacymbr,
 521                                 sizeof (*legacymbr));
 522                        good_pmbr = is_pmbr_valid(legacymbr);
 523                        kfree(legacymbr);
 524                }
 525                if (!good_pmbr)
 526                        goto fail;
 527        }
 528
 529        good_pgpt = is_gpt_valid(bdev, GPT_PRIMARY_PARTITION_TABLE_LBA,
 530                                 &pgpt, &pptes);
 531        if (good_pgpt)
 532                good_agpt = is_gpt_valid(bdev,
 533                                         le64_to_cpu(pgpt->alternate_lba),
 534                                         &agpt, &aptes);
 535        if (!good_agpt && force_gpt)
 536                good_agpt = is_gpt_valid(bdev, lastlba,
 537                                         &agpt, &aptes);
 538
 539        /* The obviously unsuccessful case */
 540        if (!good_pgpt && !good_agpt)
 541                goto fail;
 542
 543        compare_gpts(pgpt, agpt, lastlba);
 544
 545        /* The good cases */
 546        if (good_pgpt) {
 547                *gpt  = pgpt;
 548                *ptes = pptes;
 549                kfree(agpt);
 550                kfree(aptes);
 551                if (!good_agpt) {
 552                        printk(KERN_WARNING 
 553                               "Alternate GPT is invalid, "
 554                               "using primary GPT.\n");
 555                }
 556                return 1;
 557        }
 558        else if (good_agpt) {
 559                *gpt  = agpt;
 560                *ptes = aptes;
 561                kfree(pgpt);
 562                kfree(pptes);
 563                printk(KERN_WARNING 
 564                       "Primary GPT is invalid, using alternate GPT.\n");
 565                return 1;
 566        }
 567
 568 fail:
 569        kfree(pgpt);
 570        kfree(agpt);
 571        kfree(pptes);
 572        kfree(aptes);
 573        *gpt = NULL;
 574        *ptes = NULL;
 575        return 0;
 576}
 577
 578/**
 579 * efi_partition(struct parsed_partitions *state, struct block_device *bdev)
 580 * @state
 581 * @bdev
 582 *
 583 * Description: called from check.c, if the disk contains GPT
 584 * partitions, sets up partition entries in the kernel.
 585 *
 586 * If the first block on the disk is a legacy MBR,
 587 * it will get handled by msdos_partition().
 588 * If it's a Protective MBR, we'll handle it here.
 589 *
 590 * We do not create a Linux partition for GPT, but
 591 * only for the actual data partitions.
 592 * Returns:
 593 * -1 if unable to read the partition table
 594 *  0 if this isn't our partition table
 595 *  1 if successful
 596 *
 597 */
 598int
 599efi_partition(struct parsed_partitions *state, struct block_device *bdev)
 600{
 601        gpt_header *gpt = NULL;
 602        gpt_entry *ptes = NULL;
 603        u32 i;
 604
 605        if (!find_valid_gpt(bdev, &gpt, &ptes) || !gpt || !ptes) {
 606                kfree(gpt);
 607                kfree(ptes);
 608                return 0;
 609        }
 610
 611        pr_debug("GUID Partition Table is valid!  Yea!\n");
 612
 613        for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) {
 614                if (!is_pte_valid(&ptes[i], last_lba(bdev)))
 615                        continue;
 616
 617                put_partition(state, i+1, le64_to_cpu(ptes[i].starting_lba),
 618                                 (le64_to_cpu(ptes[i].ending_lba) -
 619                                  le64_to_cpu(ptes[i].starting_lba) +
 620                                  1ULL));
 621
 622                /* If this is a RAID volume, tell md */
 623                if (!efi_guidcmp(ptes[i].partition_type_guid,
 624                                 PARTITION_LINUX_RAID_GUID))
 625                        state->parts[i+1].flags = 1;
 626        }
 627        kfree(ptes);
 628        kfree(gpt);
 629        printk("\n");
 630        return 1;
 631}
 632