/************************************************************
  * EFI GUID Partition Table handling
- * Per Intel EFI Specification v1.02
- * http://developer.intel.com/technology/efi/efi.htm
+ *
+ * http://www.uefi.org/specs/
+ * http://www.intel.com/technology/efi/
+ *
  * efi.[ch] by Matt Domsch <Matt_Domsch@dell.com>
  *   Copyright 2000,2001,2002,2004 Dell Inc.
  *
  *
  ************************************************************/
 #include <linux/crc32.h>
+#include <linux/math64.h>
 #include "check.h"
 #include "efi.h"
 
 {
        if (!bdev || !bdev->bd_inode)
                return 0;
-       return (bdev->bd_inode->i_size >> 9) - 1ULL;
+       return div_u64(bdev->bd_inode->i_size,
+                      bdev_logical_block_size(bdev)) - 1ULL;
 }
 
 static inline int
 read_lba(struct block_device *bdev, u64 lba, u8 * buffer, size_t count)
 {
        size_t totalreadcount = 0;
+       sector_t n = lba * (bdev_logical_block_size(bdev) / 512);
 
        if (!bdev || !buffer || lba > last_lba(bdev))
                 return 0;
        while (count) {
                int copied = 512;
                Sector sect;
-               unsigned char *data = read_dev_sector(bdev, lba++, §);
+               unsigned char *data = read_dev_sector(bdev, n++, §);
                if (!data)
                        break;
                if (copied > count)
        gpt_header *gpt = NULL;
        gpt_entry *ptes = NULL;
        u32 i;
+       unsigned ssz = bdev_logical_block_size(bdev) / 512;
 
        if (!find_valid_gpt(bdev, &gpt, &ptes) || !gpt || !ptes) {
                kfree(gpt);
        pr_debug("GUID Partition Table is valid!  Yea!\n");
 
        for (i = 0; i < le32_to_cpu(gpt->num_partition_entries) && i < state->limit-1; i++) {
+               u64 start = le64_to_cpu(ptes[i].starting_lba);
+               u64 size = le64_to_cpu(ptes[i].ending_lba) -
+                          le64_to_cpu(ptes[i].starting_lba) + 1ULL;
+
                if (!is_pte_valid(&ptes[i], last_lba(bdev)))
                        continue;
 
-               put_partition(state, i+1, le64_to_cpu(ptes[i].starting_lba),
-                                (le64_to_cpu(ptes[i].ending_lba) -
-                                  le64_to_cpu(ptes[i].starting_lba) +
-                                 1ULL));
+               put_partition(state, i+1, start * ssz, size * ssz);
 
                /* If this is a RAID volume, tell md */
                if (!efi_guidcmp(ptes[i].partition_type_guid,