grub-devel
[Top][All Lists]
Advanced

[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;
>  }
> 


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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