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

Reply via email to