From: Rasmus Villemoes via Grub-devel <grub-devel@gnu.org>
To: "Vladimir 'phcoder' Serbinenko" <phcoder@gmail.com>
Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>,
The development of GNU GRUB <grub-devel@gnu.org>,
Daniel Kiper <daniel.kiper@oracle.com>
Subject: Re: [PATCH] kern/fs: honour file->read_hook in grub_fs_blocklist_read()
Date: Fri, 11 Oct 2024 20:12:59 +0200 [thread overview]
Message-ID: <87r08m4ifo.fsf@prevas.dk> (raw)
In-Reply-To: <CAEaD8JPg4DK9h=s6O6NTMLQB-zG3Ahu-LMXt340V+n58t84nrA@mail.gmail.com> (Vladimir Serbinenko's message of "Mon, 16 Sep 2024 18:46:44 +0300")
"Vladimir 'phcoder' Serbinenko" <phcoder@gmail.com> writes:
> Reviewed-by: phcoder@gmail.com
>
Thanks. Can this be picked up, please?
Rasmus
> Le jeu. 29 août 2024, 14:07, Rasmus Villemoes via Grub-devel <
> grub-devel@gnu.org> a écrit :
>
>> Unlike files accessed via a normal file system, the file->read_hook is
>> not honoured when using blocklist notation.
>>
>> This means that when trying to use a dedicated, 1KiB, raw partition
>> for the environment block and hence does something like
>>
>> save_env --file=(hd0,gpt9)0+2 X Y Z
>>
>> this fails with "sparse file not allowed", which is rather unexpected,
>> as I've explicitly said exactly which blocks should be used. Adding a
>> little debugging reveals that grub_file_size (file) is 1024 as
>> expected, but total_length is 0, simply because the callback was never
>> invoked, so blocklists is an empty list.
>>
>> Fix that by honouring the ->read_hook set by the caller, also when a
>> "file" is specified with blocklist notation.
>>
>> Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
>> ---
>> I've tried to keep the patch at a minimum, but since the
>> disk->read_hook needs to be cleared on all return paths, it seemed a
>> little easier to drop the 'return -1' and instead set ret and break.
>>
>> For readability, it seemed best to introduce the disk local variable to
>> hold file->device->disk, and then there's no point in not also using
>> that in the grub_disk_read() call.
>>
>> grub-core/kern/fs.c | 11 +++++++++--
>> 1 file changed, 9 insertions(+), 2 deletions(-)
>>
>> diff --git a/grub-core/kern/fs.c b/grub-core/kern/fs.c
>> index 7ad0aaf4e..79f1a797c 100644
>> --- a/grub-core/kern/fs.c
>> +++ b/grub-core/kern/fs.c
>> @@ -215,12 +215,15 @@ grub_fs_blocklist_read (grub_file_t file, char *buf,
>> grub_size_t len)
>> grub_disk_addr_t sector;
>> grub_off_t offset;
>> grub_ssize_t ret = 0;
>> + grub_disk_t disk = file->device->disk;
>>
>> if (len > file->size - file->offset)
>> len = file->size - file->offset;
>>
>> sector = (file->offset >> GRUB_DISK_SECTOR_BITS);
>> offset = (file->offset & (GRUB_DISK_SECTOR_SIZE - 1));
>> + disk->read_hook = file->read_hook;
>> + disk->read_hook_data = file->read_hook_data;
>> for (p = file->data; p->length && len > 0; p++)
>> {
>> if (sector < p->length)
>> @@ -232,9 +235,12 @@ grub_fs_blocklist_read (grub_file_t file, char *buf,
>> grub_size_t len)
>> >> GRUB_DISK_SECTOR_BITS) > p->length - sector)
>> size = ((p->length - sector) << GRUB_DISK_SECTOR_BITS) -
>> offset;
>>
>> - if (grub_disk_read (file->device->disk, p->offset + sector,
>> offset,
>> + if (grub_disk_read (disk, p->offset + sector, offset,
>> size, buf) != GRUB_ERR_NONE)
>> - return -1;
>> + {
>> + ret = -1;
>> + break;
>> + }
>>
>> ret += size;
>> len -= size;
>> @@ -244,6 +250,7 @@ grub_fs_blocklist_read (grub_file_t file, char *buf,
>> grub_size_t len)
>> else
>> sector -= p->length;
>> }
>> + disk->read_hook = 0;
>>
>> return ret;
>> }
>> --
>> 2.46.0
>>
>>
>> _______________________________________________
>> 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
next prev parent reply other threads:[~2024-10-11 18:18 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-29 11:01 [PATCH] kern/fs: honour file->read_hook in grub_fs_blocklist_read() Rasmus Villemoes via Grub-devel
2024-09-16 9:08 ` Rasmus Villemoes via Grub-devel
2024-09-16 15:46 ` Vladimir 'phcoder' Serbinenko
2024-10-11 18:12 ` Rasmus Villemoes via Grub-devel [this message]
2024-10-15 14:10 ` Daniel Kiper
2024-11-11 11:11 ` Rasmus Villemoes via Grub-devel
2024-11-12 16:08 ` Daniel Kiper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87r08m4ifo.fsf@prevas.dk \
--to=grub-devel@gnu.org \
--cc=daniel.kiper@oracle.com \
--cc=phcoder@gmail.com \
--cc=rasmus.villemoes@prevas.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.