[PATCH 1/2] disk: part: Add API to get partitions with specific driver

Joshua Watt jpewhacker at gmail.com
Wed Jun 28 15:33:59 CEST 2023


On Mon, Jun 26, 2023 at 4:07 AM Simon Glass <sjg at chromium.org> wrote:
>
> Hi Joshua,
>
> On Fri, 23 Jun 2023 at 21:01, Joshua Watt <jpewhacker at gmail.com> wrote:
> >
> > Adds part_driver_get_type() API which can be used to force a specific
> > driver to be used when getting partition information instead of relying
> > on auto detection.
> >
> > Signed-off-by: Joshua Watt <JPEWhacker at gmail.com>
> > ---
> >  disk/part.c    | 38 +++++++++++++++++++++++++++++++-------
> >  include/part.h |  2 ++
> >  2 files changed, 33 insertions(+), 7 deletions(-)
> >
> > diff --git a/disk/part.c b/disk/part.c
> > index 35300df590..1f8c786ca5 100644
> > --- a/disk/part.c
> > +++ b/disk/part.c
> > @@ -26,6 +26,22 @@
> >  /* Check all partition types */
> >  #define PART_TYPE_ALL          -1
> >
> > +static struct part_driver *part_driver_get_type(int part_type)
> > +{
> > +       struct part_driver *drv =
> > +               ll_entry_start(struct part_driver, part_driver);
> > +       const int n_ents = ll_entry_count(struct part_driver, part_driver);
> > +       struct part_driver *entry;
> > +
> > +       for (entry = drv; entry != drv + n_ents; entry++) {
> > +               if (part_type == entry->part_type)
> > +                       return entry;
> > +       }
> > +
> > +       /* Not found */
> > +       return NULL;
> > +}
> > +
> >  static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
> >  {
> >         struct part_driver *drv =
> > @@ -44,10 +60,7 @@ static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
> >                         }
> >                 }
> >         } else {
> > -               for (entry = drv; entry != drv + n_ents; entry++) {
> > -                       if (dev_desc->part_type == entry->part_type)
> > -                               return entry;
> > -               }
> > +               return part_driver_get_type(dev_desc->part_type);
> >         }
> >
> >         /* Not found */
> > @@ -306,8 +319,8 @@ void part_print(struct blk_desc *dev_desc)
> >                 drv->print(dev_desc);
> >  }
> >
> > -int part_get_info(struct blk_desc *dev_desc, int part,
> > -                      struct disk_partition *info)
> > +int part_get_info_by_type(struct blk_desc *dev_desc, int part, int part_type,
> > +                         struct disk_partition *info)
> >  {
> >         struct part_driver *drv;
> >
> > @@ -320,7 +333,12 @@ int part_get_info(struct blk_desc *dev_desc, int part,
> >                 info->type_guid[0] = 0;
> >  #endif
> >
> > -               drv = part_driver_lookup_type(dev_desc);
> > +               if (part_type == PART_TYPE_UNKNOWN) {
> > +                       drv = part_driver_lookup_type(dev_desc);
> > +               } else {
> > +                       drv = part_driver_get_type(part_type);
> > +               }
> > +
> >                 if (!drv) {
> >                         debug("## Unknown partition table type %x\n",
> >                               dev_desc->part_type);
> > @@ -340,6 +358,12 @@ int part_get_info(struct blk_desc *dev_desc, int part,
> >         return -ENOENT;
> >  }
> >
> > +int part_get_info(struct blk_desc *dev_desc, int part,
> > +                 struct disk_partition *info)
> > +{
> > +       return part_get_info_by_type(dev_desc, part, PART_TYPE_UNKNOWN, info);
> > +}
> > +
> >  int part_get_info_whole_disk(struct blk_desc *dev_desc,
> >                              struct disk_partition *info)
> >  {
> > diff --git a/include/part.h b/include/part.h
> > index be75c73549..f150c84206 100644
> > --- a/include/part.h
> > +++ b/include/part.h
> > @@ -106,6 +106,8 @@ struct blk_desc *blk_get_dev(const char *ifname, int dev);
> >  struct blk_desc *mg_disk_get_dev(int dev);
> >
> >  /* disk/part.c */
> > +int part_get_info_by_type(struct blk_desc *dev_desc, int part, int part_type,
> > +                         struct disk_partition *info);
>
> Please can you add a full comment?
>
> Also please add a test to test/dm/part.c for your new function[1]

Any trick to getting the current test/dm/part.c tests to pass? When I
run them they fail with `** No device specified **` errors, which
doesn't give me hope that I can write tests that I could actually run
locally.

>
> >  int part_get_info(struct blk_desc *dev_desc, int part,
> >                   struct disk_partition *info);
> >  /**
> > --
> > 2.33.0
> >
>
> Regards,
> Simon


More information about the U-Boot mailing list