grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/3] ieee1275: ofdisk - don't continue to query block-size after


From: Eric Snowberg
Subject: [PATCH 3/3] ieee1275: ofdisk - don't continue to query block-size after we have it
Date: Mon, 26 Oct 2015 17:43:38 -0400

Within commit: 87ec3b7fa9061f470616ed927fc140e995831c00 - "Don't continue
to query block-size if disk doesn't have it.”  Disks that returned 0 to the
block-size query, still get queried every time.

Fix logic in grub_ofdisk_get_block_size so the block size is not requested
upon each open since it will not change.

Signed-off-by: Eric Snowberg <address@hidden>
---
 grub-core/disk/ieee1275/ofdisk.c |   30 +++++++++++++++++++++++-------
 1 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
index 297f058..a75ea51 100644
--- a/grub-core/disk/ieee1275/ofdisk.c
+++ b/grub-core/disk/ieee1275/ofdisk.c
@@ -35,7 +35,8 @@ struct ofdisk_hash_ent
   char *grub_devpath;
   int is_boot;
   int is_removable;
-  int block_size_fails;
+  int block_size_retries;
+  grub_uint32_t block_size;
   /* Pointer to shortest available name on nodes representing canonical names,
      otherwise NULL.  */
   const char *shortest;
@@ -446,7 +447,17 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
       disk->log_sector_size = 9;
   }
 
+  if (last_ihandle)
+    grub_ieee1275_close (last_ihandle);
+
+  last_ihandle = 0;
+  last_devpath = NULL;
+  grub_ieee1275_open (devpath, &last_ihandle);
   grub_free (devpath);
+
+  if (! last_ihandle)
+    return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
+
   return 0;
 }
 
@@ -619,6 +630,12 @@ grub_ofdisk_get_block_size (const char *device, 
grub_uint32_t *block_size,
       grub_ieee1275_cell_t size2;
     } args_ieee1275;
 
+  if ((op->block_size_retries >= 2) || (op->block_size > 0))
+    {
+      *block_size = op->block_size;
+      return GRUB_ERR_NONE;
+    }
+
   if (last_ihandle)
     grub_ieee1275_close (last_ihandle);
 
@@ -630,9 +647,7 @@ grub_ofdisk_get_block_size (const char *device, 
grub_uint32_t *block_size,
     return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
 
   *block_size = 0;
-
-  if (op->block_size_fails >= 2)
-    return GRUB_ERR_NONE;
+  op->block_size_retries++;
 
   INIT_IEEE1275_COMMON (&args_ieee1275.common, "call-method", 2, 2);
   args_ieee1275.method = (grub_ieee1275_cell_t) "block-size";
@@ -642,21 +657,22 @@ grub_ofdisk_get_block_size (const char *device, 
grub_uint32_t *block_size,
   if (IEEE1275_CALL_ENTRY_FN (&args_ieee1275) == -1)
     {
       grub_dprintf ("disk", "can't get block size: failed call-method\n");
-      op->block_size_fails++;
     }
   else if (args_ieee1275.result)
     {
       grub_dprintf ("disk", "can't get block size: %lld\n",
                    (long long) args_ieee1275.result);
-      op->block_size_fails++;
     }
   else if (args_ieee1275.size1
           && !(args_ieee1275.size1 & (args_ieee1275.size1 - 1))
           && args_ieee1275.size1 >= 512 && args_ieee1275.size1 <= 16384)
     {
-      op->block_size_fails = 0;
+      op->block_size = args_ieee1275.size1;
       *block_size = args_ieee1275.size1;
     }
 
+  grub_ieee1275_close (last_ihandle);
+  last_ihandle = 0;
+
   return 0;
 }
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]