efi.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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 Dell Computer Corporation
  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.  * Wed  Mar 27 2002 Matt Domsch <Matt_Domsch@dell.com>
  27.  * - Ported to 2.5.7-pre1 and 2.4.18
  28.  * - Applied patch to avoid fault in alternate header handling
  29.  * - cleaned up find_valid_gpt
  30.  * - On-disk structure and copy in memory is *always* LE now - 
  31.  *   swab fields as needed
  32.  * - remove print_gpt_header()
  33.  * - only use first max_p partition entries, to keep the kernel minor number
  34.  *   and partition numbers tied.
  35.  * - 2.4.18 patch needs own crc32() function - there's no official
  36.  *   lib/crc32.c in 2.4.x.
  37.  *
  38.  * Mon  Feb 04 2002 Matt Domsch <Matt_Domsch@dell.com>
  39.  * - Removed __PRIPTR_PREFIX - not being used
  40.  *
  41.  * Mon  Jan 14 2002 Matt Domsch <Matt_Domsch@dell.com>
  42.  * - Ported to 2.5.2-pre11 + library crc32 patch Linus applied
  43.  *
  44.  * Thu Dec 6 2001 Matt Domsch <Matt_Domsch@dell.com>
  45.  * - Added compare_gpts().
  46.  * - moved le_efi_guid_to_cpus() back into this file.  GPT is the only
  47.  *   thing that keeps EFI GUIDs on disk.
  48.  * - Changed gpt structure names and members to be simpler and more Linux-like.
  49.  * 
  50.  * Wed Oct 17 2001 Matt Domsch <Matt_Domsch@dell.com>
  51.  * - Removed CONFIG_DEVFS_VOLUMES_UUID code entirely per Martin Wilck
  52.  *
  53.  * Wed Oct 10 2001 Matt Domsch <Matt_Domsch@dell.com>
  54.  * - Changed function comments to DocBook style per Andreas Dilger suggestion.
  55.  *
  56.  * Mon Oct 08 2001 Matt Domsch <Matt_Domsch@dell.com>
  57.  * - Change read_lba() to use the page cache per Al Viro's work.
  58.  * - print u64s properly on all architectures
  59.  * - fixed debug_printk(), now Dprintk()
  60.  *
  61.  * Mon Oct 01 2001 Matt Domsch <Matt_Domsch@dell.com>
  62.  * - Style cleanups
  63.  * - made most functions static
  64.  * - Endianness addition
  65.  * - remove test for second alternate header, as it's not per spec,
  66.  *   and is unnecessary.  There's now a method to read/write the last
  67.  *   sector of an odd-sized disk from user space.  No tools have ever
  68.  *   been released which used this code, so it's effectively dead.
  69.  * - Per Asit Mallick of Intel, added a test for a valid PMBR.
  70.  * - Added kernel command line option 'gpt' to override valid PMBR test.
  71.  *
  72.  * Wed Jun  6 2001 Martin Wilck <Martin.Wilck@Fujitsu-Siemens.com>
  73.  * - added devfs volume UUID support (/dev/volumes/uuids) for
  74.  *   mounting file systems by the partition GUID. 
  75.  *
  76.  * Tue Dec  5 2000 Matt Domsch <Matt_Domsch@dell.com>
  77.  * - Moved crc32() to linux/lib, added efi_crc32().
  78.  *
  79.  * Thu Nov 30 2000 Matt Domsch <Matt_Domsch@dell.com>
  80.  * - Replaced Intel's CRC32 function with an equivalent
  81.  *   non-license-restricted version.
  82.  *
  83.  * Wed Oct 25 2000 Matt Domsch <Matt_Domsch@dell.com>
  84.  * - Fixed the last_lba() call to return the proper last block
  85.  *
  86.  * Thu Oct 12 2000 Matt Domsch <Matt_Domsch@dell.com>
  87.  * - Thanks to Andries Brouwer for his debugging assistance.
  88.  * - Code works, detects all the partitions.
  89.  *
  90.  ************************************************************/
  91. #include <linux/config.h>
  92. #include <linux/fs.h>
  93. #include <linux/genhd.h>
  94. #include <linux/kernel.h>
  95. #include <linux/major.h>
  96. #include <linux/string.h>
  97. #include <linux/blk.h>
  98. #include <linux/blkpg.h>
  99. #include <linux/slab.h>
  100. #include <linux/smp_lock.h>
  101. #include <linux/init.h>
  102. #include <asm/system.h>
  103. #include <asm/byteorder.h>
  104. #include "check.h"
  105. #include "efi.h"
  106. #if CONFIG_BLK_DEV_MD
  107. extern void md_autodetect_dev(kdev_t dev);
  108. #endif
  109. /* Handle printing of 64-bit values */
  110. /* Borrowed from /usr/include/inttypes.h */
  111. # if BITS_PER_LONG == 64 
  112. #  define __PRI64_PREFIX "l"
  113. # else
  114. #  define __PRI64_PREFIX "ll"
  115. # endif
  116. # define PRIx64 __PRI64_PREFIX "x"
  117. #undef EFI_DEBUG
  118. #ifdef EFI_DEBUG
  119. #define Dprintk(x...) printk(KERN_DEBUG x)
  120. #else
  121. #define Dprintk(x...)
  122. #endif
  123. /* This allows a kernel command line option 'gpt' to override
  124.  * the test for invalid PMBR.  Not __initdata because reloading
  125.  * the partition tables happens after init too.
  126.  */
  127. static int force_gpt;
  128. static int __init
  129. force_gpt_fn(char *str)
  130. {
  131. force_gpt = 1;
  132. return 1;
  133. }
  134. __setup("gpt", force_gpt_fn);
  135. /*
  136.  * There are multiple 16-bit CRC polynomials in common use, but this is
  137.  * *the* standard CRC-32 polynomial, first popularized by Ethernet.
  138.  * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0
  139.  */
  140. #define CRCPOLY_LE 0xedb88320
  141. /* How many bits at a time to use.  Requires a table of 4<<CRC_xx_BITS bytes. */
  142. /* For less performance-sensitive, use 4 */
  143. #define CRC_LE_BITS 8
  144. static u32 *crc32table_le;
  145. /**
  146.  * crc32init_le() - allocate and initialize LE table data
  147.  *
  148.  * crc is the crc of the byte i; other entries are filled in based on the
  149.  * fact that crctable[i^j] = crctable[i] ^ crctable[j].
  150.  *
  151.  */
  152. static int __init crc32init_le(void)
  153. {
  154. unsigned i, j;
  155. u32 crc = 1;
  156. crc32table_le =
  157.     kmalloc((1 << CRC_LE_BITS) * sizeof(u32), GFP_KERNEL);
  158. if (!crc32table_le)
  159. return 1;
  160. crc32table_le[0] = 0;
  161. for (i = 1 << (CRC_LE_BITS - 1); i; i >>= 1) {
  162. crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
  163. for (j = 0; j < 1 << CRC_LE_BITS; j += 2 * i)
  164. crc32table_le[i + j] = crc ^ crc32table_le[j];
  165. }
  166. return 0;
  167. }
  168. /**
  169.  * crc32cleanup_le(): free LE table data
  170.  */
  171. static void __exit crc32cleanup_le(void)
  172. {
  173. if (crc32table_le) kfree(crc32table_le);
  174. crc32table_le = NULL;
  175. }
  176. __initcall(crc32init_le);
  177. __exitcall(crc32cleanup_le);
  178. /**
  179.  * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
  180.  * @crc - seed value for computation.  ~0 for Ethernet, sometimes 0 for
  181.  *        other uses, or the previous crc32 value if computing incrementally.
  182.  * @p   - pointer to buffer over which CRC is run
  183.  * @len - length of buffer @p
  184.  * 
  185.  */
  186. static u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
  187. {
  188. while (len--) {
  189. crc = (crc >> 8) ^ crc32table_le[(crc ^ *p++) & 255];
  190. }
  191. return crc;
  192. }
  193. /**
  194.  * efi_crc32() - EFI version of crc32 function
  195.  * @buf: buffer to calculate crc32 of
  196.  * @len - length of buf
  197.  *
  198.  * Description: Returns EFI-style CRC32 value for @buf
  199.  * 
  200.  * This function uses the little endian Ethernet polynomial
  201.  * but seeds the function with ~0, and xor's with ~0 at the end.
  202.  * Note, the EFI Specification, v1.02, has a reference to
  203.  * Dr. Dobbs Journal, May 1994 (actually it's in May 1992).
  204.  */
  205. static inline u32
  206. efi_crc32(const void *buf, unsigned long len)
  207. {
  208. return (crc32_le(~0L, buf, len) ^ ~0L);
  209. }
  210. /**
  211.  * is_pmbr_valid(): test Protective MBR for validity
  212.  * @mbr: pointer to a legacy mbr structure
  213.  *
  214.  * Description: Returns 1 if PMBR is valid, 0 otherwise.
  215.  * Validity depends on two things:
  216.  *  1) MSDOS signature is in the last two bytes of the MBR
  217.  *  2) One partition of type 0xEE is found
  218.  */
  219. static int
  220. is_pmbr_valid(legacy_mbr *mbr)
  221. {
  222. int i, found = 0, signature = 0;
  223. if (!mbr)
  224. return 0;
  225. signature = (le16_to_cpu(mbr->signature) == MSDOS_MBR_SIGNATURE);
  226. for (i = 0; signature && i < 4; i++) {
  227. if (mbr->partition_record[i].sys_ind ==
  228.                     EFI_PMBR_OSTYPE_EFI_GPT) {
  229. found = 1;
  230. break;
  231. }
  232. }
  233. return (signature && found);
  234. }
  235. /**
  236.  * last_lba(): return number of last logical block of device
  237.  * @hd: gendisk with partition list
  238.  * @bdev: block device
  239.  * 
  240.  * Description: Returns last LBA value on success, 0 on error.
  241.  * This is stored (by sd and ide-geometry) in
  242.  *  the part[0] entry for this disk, and is the number of
  243.  *  physical sectors available on the disk.
  244.  */
  245. static u64
  246. last_lba(struct gendisk *hd, struct block_device *bdev)
  247. {
  248. if (!hd || !hd->part || !bdev)
  249. return 0;
  250. return hd->part[MINOR(to_kdev_t(bdev->bd_dev))].nr_sects - 1;
  251. }
  252. /**
  253.  * read_lba(): Read bytes from disk, starting at given LBA
  254.  * @hd
  255.  * @bdev
  256.  * @lba
  257.  * @buffer
  258.  * @size_t
  259.  *
  260.  * Description:  Reads @count bytes from @bdev into @buffer.
  261.  * Returns number of bytes read on success, 0 on error.
  262.  */
  263. static size_t
  264. read_lba(struct gendisk *hd, struct block_device *bdev, u64 lba,
  265.  u8 * buffer, size_t count)
  266. {
  267. size_t totalreadcount = 0, bytesread = 0;
  268. unsigned long blocksize;
  269. int i;
  270. Sector sect;
  271. unsigned char *data = NULL;
  272. if (!hd || !bdev || !buffer || !count)
  273. return 0;
  274. blocksize = get_hardsect_size(to_kdev_t(bdev->bd_dev));
  275. if (!blocksize)
  276. blocksize = 512;
  277. for (i = 0; count > 0; i++) {
  278. data = read_dev_sector(bdev, lba, &sect);
  279. if (!data)
  280. return totalreadcount;
  281. bytesread =
  282.     PAGE_CACHE_SIZE - (data -
  283.        (unsigned char *) page_address(sect.v));
  284. bytesread = min(bytesread, count);
  285. memcpy(buffer, data, bytesread);
  286. put_dev_sector(sect);
  287. buffer += bytesread;
  288. totalreadcount += bytesread;
  289. count -= bytesread;
  290. lba += (bytesread / blocksize);
  291. }
  292. return totalreadcount;
  293. }
  294. /**
  295.  * alloc_read_gpt_entries(): reads partition entries from disk
  296.  * @hd
  297.  * @bdev
  298.  * @gpt - GPT header
  299.  * 
  300.  * Description: Returns ptes on success,  NULL on error.
  301.  * Allocates space for PTEs based on information found in @gpt.
  302.  * Notes: remember to free pte when you're done!
  303.  */
  304. static gpt_entry *
  305. alloc_read_gpt_entries(struct gendisk *hd,
  306.        struct block_device *bdev, gpt_header *gpt)
  307. {
  308. size_t count;
  309. gpt_entry *pte;
  310. if (!hd || !bdev || !gpt)
  311. return NULL;
  312. count = le32_to_cpu(gpt->num_partition_entries) *
  313.                 le32_to_cpu(gpt->sizeof_partition_entry);
  314. if (!count)
  315. return NULL;
  316. pte = kmalloc(count, GFP_KERNEL);
  317. if (!pte)
  318. return NULL;
  319. memset(pte, 0, count);
  320. if (read_lba(hd, bdev, le64_to_cpu(gpt->partition_entry_lba),
  321.                      (u8 *) pte,
  322.      count) < count) {
  323. kfree(pte);
  324.                 pte=NULL;
  325. return NULL;
  326. }
  327. return pte;
  328. }
  329. /**
  330.  * alloc_read_gpt_header(): Allocates GPT header, reads into it from disk
  331.  * @hd
  332.  * @bdev
  333.  * @lba is the Logical Block Address of the partition table
  334.  * 
  335.  * Description: returns GPT header on success, NULL on error.   Allocates
  336.  * and fills a GPT header starting at @ from @bdev.
  337.  * Note: remember to free gpt when finished with it.
  338.  */
  339. static gpt_header *
  340. alloc_read_gpt_header(struct gendisk *hd, struct block_device *bdev, u64 lba)
  341. {
  342. gpt_header *gpt;
  343. if (!hd || !bdev)
  344. return NULL;
  345. gpt = kmalloc(sizeof (gpt_header), GFP_KERNEL);
  346. if (!gpt)
  347. return NULL;
  348. memset(gpt, 0, sizeof (gpt_header));
  349. if (read_lba(hd, bdev, lba, (u8 *) gpt,
  350.      sizeof (gpt_header)) < sizeof (gpt_header)) {
  351. kfree(gpt);
  352.                 gpt=NULL;
  353. return NULL;
  354. }
  355. return gpt;
  356. }
  357. /**
  358.  * is_gpt_valid() - tests one GPT header and PTEs for validity
  359.  * @hd
  360.  * @bdev
  361.  * @lba is the logical block address of the GPT header to test
  362.  * @gpt is a GPT header ptr, filled on return.
  363.  * @ptes is a PTEs ptr, filled on return.
  364.  *
  365.  * Description: returns 1 if valid,  0 on error.
  366.  * If valid, returns pointers to newly allocated GPT header and PTEs.
  367.  */
  368. static int
  369. is_gpt_valid(struct gendisk *hd, struct block_device *bdev, u64 lba,
  370.      gpt_header **gpt, gpt_entry **ptes)
  371. {
  372. u32 crc, origcrc;
  373. if (!hd || !bdev || !gpt || !ptes)
  374. return 0;
  375. if (!(*gpt = alloc_read_gpt_header(hd, bdev, lba)))
  376. return 0;
  377. /* Check the GUID Partition Table signature */
  378. if (le64_to_cpu((*gpt)->signature) != GPT_HEADER_SIGNATURE) {
  379. Dprintk("GUID Partition Table Header signature is wrong: %"
  380. PRIx64 " != %" PRIx64 "n", le64_to_cpu((*gpt)->signature),
  381. GPT_HEADER_SIGNATURE);
  382. kfree(*gpt);
  383. *gpt = NULL;
  384. return 0;
  385. }
  386. /* Check the GUID Partition Table CRC */
  387. origcrc = le32_to_cpu((*gpt)->header_crc32);
  388. (*gpt)->header_crc32 = 0;
  389. crc = efi_crc32((const unsigned char *) (*gpt), le32_to_cpu((*gpt)->header_size));
  390. if (crc != origcrc) {
  391. Dprintk
  392.     ("GUID Partition Table Header CRC is wrong: %x != %xn",
  393.      crc, origcrc);
  394. kfree(*gpt);
  395. *gpt = NULL;
  396. return 0;
  397. }
  398. (*gpt)->header_crc32 = cpu_to_le32(origcrc);
  399. /* Check that the my_lba entry points to the LBA that contains
  400.  * the GUID Partition Table */
  401. if (le64_to_cpu((*gpt)->my_lba) != lba) {
  402. Dprintk("GPT my_lba incorrect: %" PRIx64 " != %" PRIx64 "n",
  403. le64_to_cpu((*gpt)->my_lba), lba);
  404. kfree(*gpt);
  405. *gpt = NULL;
  406. return 0;
  407. }
  408. if (!(*ptes = alloc_read_gpt_entries(hd, bdev, *gpt))) {
  409. kfree(*gpt);
  410. *gpt = NULL;
  411. return 0;
  412. }
  413. /* Check the GUID Partition Entry Array CRC */
  414. crc = efi_crc32((const unsigned char *) (*ptes),
  415. le32_to_cpu((*gpt)->num_partition_entries) *
  416. le32_to_cpu((*gpt)->sizeof_partition_entry));
  417. if (crc != le32_to_cpu((*gpt)->partition_entry_array_crc32)) {
  418. Dprintk("GUID Partitition Entry Array CRC check failed.n");
  419. kfree(*gpt);
  420. *gpt = NULL;
  421. kfree(*ptes);
  422. *ptes = NULL;
  423. return 0;
  424. }
  425. /* We're done, all's well */
  426. return 1;
  427. }
  428. /**
  429.  * compare_gpts() - Search disk for valid GPT headers and PTEs
  430.  * @pgpt is the primary GPT header
  431.  * @agpt is the alternate GPT header
  432.  * @lastlba is the last LBA number
  433.  * Description: Returns nothing.  Sanity checks pgpt and agpt fields
  434.  * and prints warnings on discrepancies.
  435.  * 
  436.  */
  437. static void
  438. compare_gpts(gpt_header *pgpt, gpt_header *agpt, u64 lastlba)
  439. {
  440. int error_found = 0;
  441. if (!pgpt || !agpt)
  442. return;
  443. if (le64_to_cpu(pgpt->my_lba) != le64_to_cpu(agpt->alternate_lba)) {
  444. printk(KERN_WARNING
  445.        "GPT:Primary header LBA != Alt. header alternate_lban");
  446. printk(KERN_WARNING "GPT:%" PRIx64 " != %" PRIx64 "n",
  447.        le64_to_cpu(pgpt->my_lba),
  448.                        le64_to_cpu(agpt->alternate_lba));
  449. error_found++;
  450. }
  451. if (le64_to_cpu(pgpt->alternate_lba) != le64_to_cpu(agpt->my_lba)) {
  452. printk(KERN_WARNING
  453.        "GPT:Primary header alternate_lba != Alt. header my_lban");
  454. printk(KERN_WARNING "GPT:%" PRIx64 " != %" PRIx64 "n",
  455.        le64_to_cpu(pgpt->alternate_lba),
  456.                        le64_to_cpu(agpt->my_lba));
  457. error_found++;
  458. }
  459. if (le64_to_cpu(pgpt->first_usable_lba) !=
  460.             le64_to_cpu(agpt->first_usable_lba)) {
  461. printk(KERN_WARNING "GPT:first_usable_lbas don't match.n");
  462. printk(KERN_WARNING "GPT:%" PRIx64 " != %" PRIx64 "n",
  463.        le64_to_cpu(pgpt->first_usable_lba),
  464.                        le64_to_cpu(agpt->first_usable_lba));
  465. error_found++;
  466. }
  467. if (le64_to_cpu(pgpt->last_usable_lba) !=
  468.             le64_to_cpu(agpt->last_usable_lba)) {
  469. printk(KERN_WARNING "GPT:last_usable_lbas don't match.n");
  470. printk(KERN_WARNING "GPT:%" PRIx64 " != %" PRIx64 "n",
  471.        le64_to_cpu(pgpt->last_usable_lba),
  472.                        le64_to_cpu(agpt->last_usable_lba));
  473. error_found++;
  474. }
  475. if (efi_guidcmp(pgpt->disk_guid, agpt->disk_guid)) {
  476. printk(KERN_WARNING "GPT:disk_guids don't match.n");
  477. error_found++;
  478. }
  479. if (le32_to_cpu(pgpt->num_partition_entries) !=
  480.             le32_to_cpu(agpt->num_partition_entries)) {
  481. printk(KERN_WARNING "GPT:num_partition_entries don't match: "
  482.        "0x%x != 0x%xn",
  483.        le32_to_cpu(pgpt->num_partition_entries),
  484.        le32_to_cpu(agpt->num_partition_entries));
  485. error_found++;
  486. }
  487. if (le32_to_cpu(pgpt->sizeof_partition_entry) !=
  488.             le32_to_cpu(agpt->sizeof_partition_entry)) {
  489. printk(KERN_WARNING
  490.        "GPT:sizeof_partition_entry values don't match: "
  491.        "0x%x != 0x%xn",
  492.                        le32_to_cpu(pgpt->sizeof_partition_entry),
  493.        le32_to_cpu(agpt->sizeof_partition_entry));
  494. error_found++;
  495. }
  496. if (le32_to_cpu(pgpt->partition_entry_array_crc32) !=
  497.             le32_to_cpu(agpt->partition_entry_array_crc32)) {
  498. printk(KERN_WARNING
  499.        "GPT:partition_entry_array_crc32 values don't match: "
  500.        "0x%x != 0x%xn",
  501.                        le32_to_cpu(pgpt->partition_entry_array_crc32),
  502.        le32_to_cpu(agpt->partition_entry_array_crc32));
  503. error_found++;
  504. }
  505. if (le64_to_cpu(pgpt->alternate_lba) != lastlba) {
  506. printk(KERN_WARNING
  507.        "GPT:Primary header thinks Alt. header is not at the end of the disk.n");
  508. printk(KERN_WARNING "GPT:%" PRIx64 " != %" PRIx64 "n",
  509.        le64_to_cpu(pgpt->alternate_lba), lastlba);
  510. error_found++;
  511. }
  512. if (le64_to_cpu(agpt->my_lba) != lastlba) {
  513. printk(KERN_WARNING
  514.        "GPT:Alternate GPT header not at the end of the disk.n");
  515. printk(KERN_WARNING "GPT:%" PRIx64 " != %" PRIx64 "n",
  516.        le64_to_cpu(agpt->my_lba), lastlba);
  517. error_found++;
  518. }
  519. if (error_found)
  520. printk(KERN_WARNING
  521.        "GPT: Use GNU Parted to correct GPT errors.n");
  522. return;
  523. }
  524. /**
  525.  * find_valid_gpt() - Search disk for valid GPT headers and PTEs
  526.  * @hd
  527.  * @bdev
  528.  * @gpt is a GPT header ptr, filled on return.
  529.  * @ptes is a PTEs ptr, filled on return.
  530.  * Description: Returns 1 if valid, 0 on error.
  531.  * If valid, returns pointers to newly allocated GPT header and PTEs.
  532.  * Validity depends on finding either the Primary GPT header and PTEs valid,
  533.  * or the Alternate GPT header and PTEs valid, and the PMBR valid.
  534.  */
  535. static int
  536. find_valid_gpt(struct gendisk *hd, struct block_device *bdev,
  537.        gpt_header **gpt, gpt_entry **ptes)
  538. {
  539. int good_pgpt = 0, good_agpt = 0, good_pmbr = 0;
  540. gpt_header *pgpt = NULL, *agpt = NULL;
  541. gpt_entry *pptes = NULL, *aptes = NULL;
  542. legacy_mbr *legacymbr = NULL;
  543. u64 lastlba;
  544. if (!hd || !bdev || !gpt || !ptes)
  545. return 0;
  546. lastlba = last_lba(hd, bdev);
  547. good_pgpt = is_gpt_valid(hd, bdev, GPT_PRIMARY_PARTITION_TABLE_LBA,
  548.  &pgpt, &pptes);
  549.         if (good_pgpt) {
  550. good_agpt = is_gpt_valid(hd, bdev,
  551.                                          le64_to_cpu(pgpt->alternate_lba),
  552.  &agpt, &aptes);
  553.                 if (!good_agpt) {
  554.                         good_agpt = is_gpt_valid(hd, bdev, lastlba,
  555.                                                  &agpt, &aptes);
  556.                 }
  557.         }
  558.         else {
  559.                 good_agpt = is_gpt_valid(hd, bdev, lastlba,
  560.                                          &agpt, &aptes);
  561.         }
  562.         /* The obviously unsuccessful case */
  563.         if (!good_pgpt && !good_agpt) {
  564.                 goto fail;
  565.         }
  566. /* This will be added to the EFI Spec. per Intel after v1.02. */
  567.         legacymbr = kmalloc(sizeof (*legacymbr), GFP_KERNEL);
  568.         if (legacymbr) {
  569.                 memset(legacymbr, 0, sizeof (*legacymbr));
  570.                 read_lba(hd, bdev, 0, (u8 *) legacymbr,
  571.                          sizeof (*legacymbr));
  572.                 good_pmbr = is_pmbr_valid(legacymbr);
  573.                 kfree(legacymbr);
  574.                 legacymbr=NULL;
  575.         }
  576.         /* Failure due to bad PMBR */
  577.         if ((good_pgpt || good_agpt) && !good_pmbr && !force_gpt) {
  578.                 printk(KERN_WARNING 
  579.                        "  Warning: Disk has a valid GPT signature "
  580.                        "but invalid PMBR.n");
  581.                 printk(KERN_WARNING
  582.                        "  Assuming this disk is *not* a GPT disk anymore.n");
  583.                 printk(KERN_WARNING
  584.                        "  Use gpt kernel option to override.  "
  585.                        "Use GNU Parted to correct disk.n");
  586.                 goto fail;
  587.         }
  588.         /* Would fail due to bad PMBR, but force GPT anyhow */
  589.         if ((good_pgpt || good_agpt) && !good_pmbr && force_gpt) {
  590.                 printk(KERN_WARNING
  591.                        "  Warning: Disk has a valid GPT signature but "
  592.                        "invalid PMBR.n");
  593.                 printk(KERN_WARNING
  594.                        "  Use GNU Parted to correct disk.n");
  595.                 printk(KERN_WARNING
  596.                        "  gpt option taken, disk treated as GPT.n");
  597.         }
  598.         compare_gpts(pgpt, agpt, lastlba);
  599.         /* The good cases */
  600.         if (good_pgpt && (good_pmbr || force_gpt)) {
  601.                 *gpt  = pgpt;
  602.                 *ptes = pptes;
  603.                 if (agpt)  { kfree(agpt);   agpt = NULL; }
  604.                 if (aptes) { kfree(aptes); aptes = NULL; }
  605.                 if (!good_agpt) {
  606.                         printk(KERN_WARNING 
  607.        "Alternate GPT is invalid, "
  608.                                "using primary GPT.n");
  609.                 }
  610.                 return 1;
  611.         }
  612.         else if (good_agpt && (good_pmbr || force_gpt)) {
  613.                 *gpt  = agpt;
  614.                 *ptes = aptes;
  615.                 if (pgpt)  { kfree(pgpt);   pgpt = NULL; }
  616.                 if (pptes) { kfree(pptes); pptes = NULL; }
  617.                 printk(KERN_WARNING 
  618.                        "Primary GPT is invalid, using alternate GPT.n");
  619.                 return 1;
  620.         }
  621.  fail:
  622.         if (pgpt)  { kfree(pgpt);   pgpt=NULL; }
  623.         if (agpt)  { kfree(agpt);   agpt=NULL; }
  624.         if (pptes) { kfree(pptes); pptes=NULL; }
  625.         if (aptes) { kfree(aptes); aptes=NULL; }
  626.         *gpt = NULL;
  627.         *ptes = NULL;
  628.         return 0;
  629. }
  630. /**
  631.  * add_gpt_partitions(struct gendisk *hd, struct block_device *bdev,
  632.  * @hd
  633.  * @bdev
  634.  *
  635.  * Description: Create devices for each entry in the GUID Partition Table
  636.  * Entries.
  637.  *
  638.  * We do not create a Linux partition for GPT, but
  639.  * only for the actual data partitions.
  640.  * Returns:
  641.  * -1 if unable to read the partition table
  642.  *  0 if this isn't our partition table
  643.  *  1 if successful
  644.  *
  645.  */
  646. static int
  647. add_gpt_partitions(struct gendisk *hd, struct block_device *bdev, int nextminor)
  648. {
  649. gpt_header *gpt = NULL;
  650. gpt_entry *ptes = NULL;
  651. u32 i;
  652. int max_p; 
  653. if (!hd || !bdev)
  654. return -1;
  655. if (!find_valid_gpt(hd, bdev, &gpt, &ptes) || !gpt || !ptes) {
  656. if (gpt) {
  657. kfree(gpt);
  658.                         gpt = NULL;
  659.                 }
  660. if (ptes) {
  661. kfree(ptes);
  662.                         ptes = NULL;
  663.                 }
  664. return 0;
  665. }
  666. Dprintk("GUID Partition Table is valid!  Yea!n");
  667. max_p = (1 << hd->minor_shift) - 1;
  668. for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < max_p; i++) {
  669. if (!efi_guidcmp(ptes[i].partition_type_guid, NULL_GUID))
  670. continue;
  671. add_gd_partition(hd, nextminor+i,
  672.                                  le64_to_cpu(ptes[i].starting_lba),
  673.  (le64_to_cpu(ptes[i].ending_lba) -
  674.                                   le64_to_cpu(ptes[i].starting_lba) +
  675.   1));
  676. /* If there's this is a RAID volume, tell md */
  677. #if CONFIG_BLK_DEV_MD
  678. if (!efi_guidcmp(ptes[i].partition_type_guid,
  679.                                  PARTITION_LINUX_RAID_GUID)) {
  680.                         md_autodetect_dev(MKDEV
  681.                                           (MAJOR(to_kdev_t(bdev->bd_dev)),
  682.                                            nextminor+i));
  683. }
  684. #endif
  685. }
  686. kfree(ptes);
  687.         ptes=NULL;
  688. kfree(gpt);
  689.         gpt=NULL;
  690. printk("n");
  691. return 1;
  692. }
  693. /**
  694.  * efi_partition(): EFI GPT partition handling entry function
  695.  * @hd
  696.  * @bdev
  697.  * @first_sector: unused
  698.  * @first_part_minor: minor number assigned to first GPT partition found
  699.  *
  700.  * Description: called from check.c, if the disk contains GPT
  701.  * partitions, sets up partition entries in the kernel.
  702.  *
  703.  * If the first block on the disk is a legacy MBR,
  704.  * it will get handled by msdos_partition().
  705.  * If it's a Protective MBR, we'll handle it here.
  706.  *
  707.  * set_blocksize() calls are necessary to be able to read
  708.  * a disk with an odd number of 512-byte sectors, as the
  709.  * default BLOCK_SIZE of 1024 bytes won't let that last
  710.  * sector be read otherwise.
  711.  *
  712.  * Returns:
  713.  * -1 if unable to read the partition table
  714.  *  0 if this isn't our partitoin table
  715.  *  1 if successful
  716.  */
  717. int
  718. efi_partition(struct gendisk *hd, struct block_device *bdev,
  719.       unsigned long first_sector, int first_part_minor)
  720. {
  721. kdev_t dev = to_kdev_t(bdev->bd_dev);
  722. int hardblocksize = get_hardsect_size(dev);
  723. int orig_blksize_size = BLOCK_SIZE;
  724. int rc = 0;
  725. /* Need to change the block size that the block layer uses */
  726. if (blksize_size[MAJOR(dev)]) {
  727.                 orig_blksize_size = blksize_size[MAJOR(dev)][MINOR(dev)];
  728. }
  729. if (orig_blksize_size != hardblocksize)
  730. set_blocksize(dev, hardblocksize);
  731. rc = add_gpt_partitions(hd, bdev, first_part_minor);
  732. /* change back */
  733. if (orig_blksize_size != hardblocksize)
  734. set_blocksize(dev, orig_blksize_size);
  735. return rc;
  736. }