Rather than having extra code in all drivers, just put it in common init like we do with log sector size
On Mon, 22 Feb 2016 17:59 Andrei Borzenkov <arvidj...@gmail.com> wrote: > 19.02.2016 19:18, Leif Lindholm пишет: > > Some disk types have allocation requirements beyond normal grub_malloc. > > Add a function pointer to grub_disk_t and a wrapper function in > > kern/disk.c making use of that function if available, to enable these > > disk drivers to implement their own malloc. > > --- > > grub-core/kern/disk.c | 13 +++++++++++-- > > include/grub/disk.h | 5 +++++ > > 2 files changed, 16 insertions(+), 2 deletions(-) > > > > diff --git a/grub-core/kern/disk.c b/grub-core/kern/disk.c > > index 789f8c0..e186586 100644 > > --- a/grub-core/kern/disk.c > > +++ b/grub-core/kern/disk.c > > @@ -184,6 +184,15 @@ find_part_sep (const char *name) > > return NULL; > > } > > > > +static void * > > +disk_malloc (struct grub_disk *disk, grub_size_t size) > > +{ > > + if (disk->malloc) > > + return disk->malloc (disk, size); > > + > > + return grub_malloc (size); > > +} > > Just initialize disk->malloc to grub_alloc in all other drivers then, no > need for repeated runtime check. > > > + > > grub_disk_t > > grub_disk_open (const char *name) > > { > > @@ -331,7 +340,7 @@ grub_disk_read_small_real (grub_disk_t disk, > grub_disk_addr_t sector, > > } > > > > /* Allocate a temporary buffer. */ > > - tmp_buf = grub_malloc (GRUB_DISK_SECTOR_SIZE << GRUB_DISK_CACHE_BITS); > > + tmp_buf = disk_malloc (disk, GRUB_DISK_SECTOR_SIZE << > GRUB_DISK_CACHE_BITS); > > if (! tmp_buf) > > return grub_errno; > > > > @@ -373,7 +382,7 @@ grub_disk_read_small_real (grub_disk_t disk, > grub_disk_addr_t sector, > > num = ((size + offset + (1ULL << (disk->log_sector_size)) > > - 1) >> (disk->log_sector_size)); > > > > - tmp_buf = grub_malloc (num << disk->log_sector_size); > > + tmp_buf = disk_malloc (disk, num << disk->log_sector_size); > > if (!tmp_buf) > > return grub_errno; > > > > diff --git a/include/grub/disk.h b/include/grub/disk.h > > index b385af8..0fdd779 100644 > > --- a/include/grub/disk.h > > +++ b/include/grub/disk.h > > @@ -111,6 +111,8 @@ typedef void (*grub_disk_read_hook_t) > (grub_disk_addr_t sector, > > unsigned offset, unsigned length, > > void *data); > > > > +typedef void *(*grub_disk_malloc_t) (struct grub_disk *disk, > grub_size_t size); > > + > > /* Disk. */ > > struct grub_disk > > { > > @@ -144,6 +146,9 @@ struct grub_disk > > > > /* Device-specific data. */ > > void *data; > > + > > + /* Device-specific malloc function. */ > > + grub_disk_malloc_t malloc; > > }; > > typedef struct grub_disk *grub_disk_t; > > > > > > > _______________________________________________ > 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