Re: Fwd: [PATCH 4/9] btrfs: Avoid a rescan for a device which was already not found.
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.
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.
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