[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 3/3] ieee1275: ofdisk - don't continue to query block-size af
From: |
Vladimir 'φ-coder/phcoder' Serbinenko |
Subject: |
Re: [PATCH 3/3] ieee1275: ofdisk - don't continue to query block-size after we have it |
Date: |
Mon, 26 Oct 2015 23:02:00 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.2.0 |
On 26.10.2015 22:43, Eric Snowberg wrote:
> 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.
>
Is it true for removable disks as well? What about someone unplugging
USB stick and plugging-in 4K USB HDD?
> 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;
> }
>
signature.asc
Description: OpenPGP digital signature