[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