Re: Fwd: [PATCH 4/9] btrfs: Avoid a rescan for a device which was already not found.

2018-06-14 Thread Goffredo Baroncelli
On 06/14/2018 01:45 PM, Daniel Kiper wrote:
> On Mon, Jun 04, 2018 at 09:26:06PM +0200, Goffredo Baroncelli wrote:
>> Resend this patch because I am not sure that all received it.
> 
> It looks that #4 is a bit unfortunate for you and/or patch series... :-)))

Yes, but I have another suspect: the patch #4 never changed, and I know that 
gmail "collapse" the emails when these are equal...
> 
>> BR
>> G.Baroncelli
>>
>>
>>  Forwarded Message 
>> Subject: [PATCH 4/9] btrfs: Avoid a rescan for a device which was already 
>> not found.
>> Date: Sun,  3 Jun 2018 20:53:43 +0200
>> From: Goffredo Baroncelli 
>> To: grub-devel@gnu.org
>> CC: Goffredo Baroncelli 
>>
>> If a device is not found, record this failure by storing NULL in
>> data->devices_attached[]. This way we avoid unnecessary devices rescan,
> 
> Hmmm... Could you point me out where this store happens below?

Se below
[...]

>>for (i = 0; i < data->n_devices_attached; i++)
>>  if (id == data->devices_attached[i].id)
>>return data->devices_attached[i].dev;
>> -  if (do_rescan)
>> -grub_device_iterate (find_device_iter, );
>> -  if (!ctx.dev_found)
>> -{
>> -  return NULL;
>> -}

The check above, performs a function exit if ctx.dev_found is NULL. Removing 
this check allows to store the NULL in the array.
In case of another iteration we know that the device is missing without doing a 
rescam

>> +
>> +  grub_device_iterate (find_device_iter, );
>> +
>>data->n_devices_attached++;
>>if (data->n_devices_attached > data->n_devices_allocated)
>>  {
>> @@ -617,7 +614,8 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t 
>> id, int do_rescan)
>>  * sizeof (data->devices_attached[0]));
>>if (!data->devices_attached)
>>  {
>> -  grub_device_close (ctx.dev_found);
>> +  if (ctx.dev_found)
>> +grub_device_close (ctx.dev_found);
>>data->devices_attached = tmp;
>>return NULL;
>>  }
>> @@ -896,7 +894,7 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, 
>> grub_disk_addr_t addr,
>>" for laddr 0x%" PRIxGRUB_UINT64_T "\n", paddr,
>>addr);
>>
>> -dev = find_device (data, stripe->device_id, j);
>> +dev = find_device (data, stripe->device_id);
>>  if (!dev)
>>{
>>  grub_dprintf ("btrfs",
>> @@ -973,7 +971,8 @@ grub_btrfs_unmount (struct grub_btrfs_data *data)
>>unsigned i;
>>/* The device 0 is closed one layer upper.  */
>>for (i = 1; i < data->n_devices_attached; i++)
>> -grub_device_close (data->devices_attached[i].dev);
>> +if (data->devices_attached[i].dev)
>> +grub_device_close (data->devices_attached[i].dev);
>>grub_free (data->devices_attached);
>>grub_free (data->extent);
>>grub_free (data);
>> --
>> 2.17.1
>>
>>
>>
>> ___
>> Grub-devel mailing list
>> Grub-devel@gnu.org
>> https://lists.gnu.org/mailman/listinfo/grub-devel
>>
> 


-- 
gpg @keyserver.linux.it: Goffredo Baroncelli 
Key fingerprint BBF5 1610 0B64 DAC6 5F7D  17B2 0EDA 9B37 8B82 E0B5

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Re: Fwd: [PATCH 4/9] btrfs: Avoid a rescan for a device which was already not found.

2018-06-14 Thread Daniel Kiper
On Mon, Jun 04, 2018 at 09:26:06PM +0200, Goffredo Baroncelli wrote:
> Resend this patch because I am not sure that all received it.

It looks that #4 is a bit unfortunate for you and/or patch series... :-)))

> BR
> G.Baroncelli
>
>
>  Forwarded Message 
> Subject: [PATCH 4/9] btrfs: Avoid a rescan for a device which was already not 
> found.
> Date: Sun,  3 Jun 2018 20:53:43 +0200
> From: Goffredo Baroncelli 
> To: grub-devel@gnu.org
> CC: Goffredo Baroncelli 
>
> If a device is not found, record this failure by storing NULL in
> data->devices_attached[]. This way we avoid unnecessary devices rescan,

Hmmm... Could you point me out where this store happens below?

Daniel

> and speedup the reads in case of a degraded array.
>
> Signed-off-by: Goffredo Baroncelli 
> ---
>  grub-core/fs/btrfs.c | 19 +--
>  1 file changed, 9 insertions(+), 10 deletions(-)
>
> diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
> index 9b3a22772..b64b692f8 100644
> --- a/grub-core/fs/btrfs.c
> +++ b/grub-core/fs/btrfs.c
> @@ -588,7 +588,7 @@ find_device_iter (const char *name, void *data)
>  }
>
>  static grub_device_t
> -find_device (struct grub_btrfs_data *data, grub_uint64_t id, int do_rescan)
> +find_device (struct grub_btrfs_data *data, grub_uint64_t id)
>  {
>struct find_device_ctx ctx = {
>  .data = data,
> @@ -600,12 +600,9 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t 
> id, int do_rescan)
>for (i = 0; i < data->n_devices_attached; i++)
>  if (id == data->devices_attached[i].id)
>return data->devices_attached[i].dev;
> -  if (do_rescan)
> -grub_device_iterate (find_device_iter, );
> -  if (!ctx.dev_found)
> -{
> -  return NULL;
> -}
> +
> +  grub_device_iterate (find_device_iter, );
> +
>data->n_devices_attached++;
>if (data->n_devices_attached > data->n_devices_allocated)
>  {
> @@ -617,7 +614,8 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t 
> id, int do_rescan)
>   * sizeof (data->devices_attached[0]));
>if (!data->devices_attached)
>   {
> -   grub_device_close (ctx.dev_found);
> +   if (ctx.dev_found)
> + grub_device_close (ctx.dev_found);
> data->devices_attached = tmp;
> return NULL;
>   }
> @@ -896,7 +894,7 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, 
> grub_disk_addr_t addr,
> " for laddr 0x%" PRIxGRUB_UINT64_T "\n", paddr,
> addr);
>
> - dev = find_device (data, stripe->device_id, j);
> + dev = find_device (data, stripe->device_id);
>   if (!dev)
> {
>   grub_dprintf ("btrfs",
> @@ -973,7 +971,8 @@ grub_btrfs_unmount (struct grub_btrfs_data *data)
>unsigned i;
>/* The device 0 is closed one layer upper.  */
>for (i = 1; i < data->n_devices_attached; i++)
> -grub_device_close (data->devices_attached[i].dev);
> +if (data->devices_attached[i].dev)
> +grub_device_close (data->devices_attached[i].dev);
>grub_free (data->devices_attached);
>grub_free (data->extent);
>grub_free (data);
> --
> 2.17.1
>
>
>
> ___
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


Fwd: [PATCH 4/9] btrfs: Avoid a rescan for a device which was already not found.

2018-06-04 Thread Goffredo Baroncelli
Resend this patch because I am not sure that all received it.
BR
G.Baroncelli


 Forwarded Message 
Subject: [PATCH 4/9] btrfs: Avoid a rescan for a device which was already not 
found.
Date: Sun,  3 Jun 2018 20:53:43 +0200
From: Goffredo Baroncelli 
To: grub-devel@gnu.org
CC: Goffredo Baroncelli 

If a device is not found, record this failure by storing NULL in
data->devices_attached[]. This way we avoid unnecessary devices rescan,
and speedup the reads in case of a degraded array.

Signed-off-by: Goffredo Baroncelli 
---
 grub-core/fs/btrfs.c | 19 +--
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c
index 9b3a22772..b64b692f8 100644
--- a/grub-core/fs/btrfs.c
+++ b/grub-core/fs/btrfs.c
@@ -588,7 +588,7 @@ find_device_iter (const char *name, void *data)
 }
 
 static grub_device_t
-find_device (struct grub_btrfs_data *data, grub_uint64_t id, int do_rescan)
+find_device (struct grub_btrfs_data *data, grub_uint64_t id)
 {
   struct find_device_ctx ctx = {
 .data = data,
@@ -600,12 +600,9 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t 
id, int do_rescan)
   for (i = 0; i < data->n_devices_attached; i++)
 if (id == data->devices_attached[i].id)
   return data->devices_attached[i].dev;
-  if (do_rescan)
-grub_device_iterate (find_device_iter, );
-  if (!ctx.dev_found)
-{
-  return NULL;
-}
+
+  grub_device_iterate (find_device_iter, );
+
   data->n_devices_attached++;
   if (data->n_devices_attached > data->n_devices_allocated)
 {
@@ -617,7 +614,8 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t 
id, int do_rescan)
* sizeof (data->devices_attached[0]));
   if (!data->devices_attached)
{
- grub_device_close (ctx.dev_found);
+ if (ctx.dev_found)
+   grub_device_close (ctx.dev_found);
  data->devices_attached = tmp;
  return NULL;
}
@@ -896,7 +894,7 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, 
grub_disk_addr_t addr,
  " for laddr 0x%" PRIxGRUB_UINT64_T "\n", paddr,
  addr);
 
-   dev = find_device (data, stripe->device_id, j);
+   dev = find_device (data, stripe->device_id);
if (!dev)
  {
grub_dprintf ("btrfs",
@@ -973,7 +971,8 @@ grub_btrfs_unmount (struct grub_btrfs_data *data)
   unsigned i;
   /* The device 0 is closed one layer upper.  */
   for (i = 1; i < data->n_devices_attached; i++)
-grub_device_close (data->devices_attached[i].dev);
+if (data->devices_attached[i].dev)
+grub_device_close (data->devices_attached[i].dev);
   grub_free (data->devices_attached);
   grub_free (data->extent);
   grub_free (data);
-- 
2.17.1



___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel