c1a25d0
From 61474615b8e177881caa89fc04cae16019cf01b9 Mon Sep 17 00:00:00 2001
c1a25d0
From: Matthew Garrett <mjg@redhat.com>
c1a25d0
Date: Wed, 15 Aug 2012 14:37:07 -0400
c1a25d0
Subject: [PATCH] efidisk: Read chunks in smaller blocks
c1a25d0
c1a25d0
---
c1a25d0
 grub-core/disk/efi/efidisk.c | 26 ++++++++++++++++++++++----
c1a25d0
 1 file changed, 22 insertions(+), 4 deletions(-)
c1a25d0
c1a25d0
diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c
c1a25d0
index a432b44..77ab5b0 100644
c1a25d0
--- a/grub-core/disk/efi/efidisk.c
c1a25d0
+++ b/grub-core/disk/efi/efidisk.c
c1a25d0
@@ -546,6 +546,9 @@ grub_efidisk_read (struct grub_disk *disk, grub_disk_addr_t sector,
c1a25d0
   struct grub_efidisk_data *d;
c1a25d0
   grub_efi_block_io_t *bio;
c1a25d0
   grub_efi_status_t status;
c1a25d0
+  grub_size_t remaining = size;
c1a25d0
+  grub_size_t read = 0;
c1a25d0
+  grub_size_t chunk = 0x500;
c1a25d0
 
c1a25d0
   d = disk->data;
c1a25d0
   bio = d->block_io;
c1a25d0
@@ -554,14 +557,29 @@ grub_efidisk_read (struct grub_disk *disk, grub_disk_addr_t sector,
c1a25d0
 		"reading 0x%lx sectors at the sector 0x%llx from %s\n",
c1a25d0
 		(unsigned long) size, (unsigned long long) sector, disk->name);
c1a25d0
 
c1a25d0
+  while (remaining > chunk) {
c1a25d0
+    status = efi_call_5 (bio->read_blocks, bio, bio->media->media_id,
c1a25d0
+			 (grub_efi_uint64_t) sector + read,
c1a25d0
+			 (grub_efi_uintn_t) chunk << disk->log_sector_size,
c1a25d0
+			 buf + (read << disk->log_sector_size));
c1a25d0
+    if (status != GRUB_EFI_SUCCESS)
c1a25d0
+      return grub_error (GRUB_ERR_READ_ERROR,
c1a25d0
+			 N_("failure reading sector 0x%llx from `%s'"),
c1a25d0
+			 (unsigned long long) sector + read,
c1a25d0
+			 disk->name);
c1a25d0
+    read += chunk;
c1a25d0
+    remaining -= chunk;
c1a25d0
+  }
c1a25d0
+
c1a25d0
   status = efi_call_5 (bio->read_blocks, bio, bio->media->media_id,
c1a25d0
-		       (grub_efi_uint64_t) sector,
c1a25d0
-		       (grub_efi_uintn_t) size << disk->log_sector_size,
c1a25d0
-		       buf);
c1a25d0
+		       (grub_efi_uint64_t) sector + read,
c1a25d0
+		       (grub_efi_uintn_t) remaining << disk->log_sector_size,
c1a25d0
+		       buf + (read << disk->log_sector_size));
c1a25d0
+
c1a25d0
   if (status != GRUB_EFI_SUCCESS)
c1a25d0
     return grub_error (GRUB_ERR_READ_ERROR,
c1a25d0
 		       N_("failure reading sector 0x%llx from `%s'"),
c1a25d0
-		       (unsigned long long) sector,
c1a25d0
+		       (unsigned long long) sector + read,
c1a25d0
 		       disk->name);
c1a25d0
 
c1a25d0
   return GRUB_ERR_NONE;
c1a25d0
-- 
c1a25d0
1.7.11.2
c1a25d0