[PATCH] cmd: gpt: Add option to write GPT partitions to environment variable

Farhan Ali farhan.ali at broadcom.com
Thu Feb 25 23:25:31 CET 2021


Hi Heinrich,

Thank you for your comments. I will add your recommendations and resubmit,
I just want to clarify the use case here:

-Right now we have commands to read the GPT table into an internal data
structure, and from then on we can only rename or swap partitions
-If a user wants to modify all aspects of the partition layout, they
currently dont have any way to do so from the uboot command line
-With this proposed change, users would be able to export the entire
partition table to a uboot environment variable and then edit all of it
enmasse

Regards, Farhan




On Thu, Feb 25, 2021 at 12:03 PM Heinrich Schuchardt <xypron.glpk at gmx.de>
wrote:

> On 2/25/21 7:56 PM, Farhan Ali wrote:
> > This change would enhance the existing 'gpt read' command to allow
> > (optionally) writing of the read GPT partitions to an environment
> > variable. This would allow users to easily change the partition
> > settings and then simply reuse the variable in the 'gpt write' and
> > 'gpt verify' commands.
> >
> > Signed-off-by: Farhan Ali <farhan.ali at broadcom.com>
>
> Hello Farhan,
>
> It is unclear what your use case is.
>
> 'gpt read' already reads the data into a data structure for
> manipulation. See doc/README.gpt.
>
> Please, provide an example showing how you will use the variable.
>
> > ---
> > Cc: Simon Glass <sjg at chromium.org>
> > Cc: Heinrich Schuchardt <xypron.glpk at gmx.de>
> > Cc: Corneliu Doban <cdoban at broadcom.com>
> > Cc: Rayagonda Kokatanur <rayagonda.kokatanur at broadcom.com>
> >
> >   cmd/gpt.c | 46 ++++++++++++++++++++++++++++++++++++++--------
> >   1 file changed, 38 insertions(+), 8 deletions(-)
> >
> > diff --git a/cmd/gpt.c b/cmd/gpt.c
> > index 76a95ad..12d0551 100644
> > --- a/cmd/gpt.c
> > +++ b/cmd/gpt.c
> > @@ -350,17 +350,46 @@ static int get_gpt_info(struct blk_desc *dev_desc)
> >   }
> >
> >   /* a wrapper to test get_gpt_info */
> > -static int do_get_gpt_info(struct blk_desc *dev_desc)
> > +static int do_get_gpt_info(struct blk_desc *dev_desc, char * const
> namestr)
> >   {
> > -     int ret;
> > +     int numparts;
> > +
> > +     numparts = get_gpt_info(dev_desc);
> > +
> > +     if (numparts > 0) {
> > +             if (namestr) {
>
> If the parameter is missing, the caller passes random bytes and not
> NULL. So this check does not work.
>
> > +                     char disk_guid[UUID_STR_LEN + 1];
> > +                     char *partitions_list;
> > +                     int partlistlen;
> > +                     int ret = -1;
> > +
> > +                     ret = get_disk_guid(dev_desc, disk_guid);
> > +                     if (ret < 0)
> > +                             return ret;
> > +
> > +                     partlistlen = calc_parts_list_len(numparts);
> > +                     partitions_list = malloc(partlistlen);
> > +                     if (!partitions_list) {
> > +                             del_gpt_info();
> > +                             return -ENOMEM;
> > +                     }
> > +                     memset(partitions_list, '\0', partlistlen);
> > +
> > +                     ret = create_gpt_partitions_list(numparts,
> disk_guid,
> > +                                                      partitions_list);
> > +                     if (ret < 0)
> > +                             printf("Error: Could not create partition
> list string!\n");
> > +                     else
> > +                             env_set(namestr, partitions_list);
> >
> > -     ret = get_gpt_info(dev_desc);
> > -     if (ret > 0) {
> > -             print_gpt_info();
> > +                     free(partitions_list);
> > +             } else {
> > +                     print_gpt_info();
> > +             }
> >               del_gpt_info();
> >               return 0;
> >       }
> > -     return ret;
> > +     return numparts;
> >   }
> >   #endif
> >
> > @@ -982,7 +1011,7 @@ static int do_gpt(struct cmd_tbl *cmdtp, int flag,
> int argc, char *const argv[])
> >               ret = do_disk_guid(blk_dev_desc, argv[4]);
> >   #ifdef CONFIG_CMD_GPT_RENAME
> >       } else if (strcmp(argv[1], "read") == 0) {
> > -             ret = do_get_gpt_info(blk_dev_desc);
> > +             ret = do_get_gpt_info(blk_dev_desc, argv[4]);
>
> You have to check argc to know if argv[4] exists and pass argv[4] or
> NULL accordingly.
>
> >       } else if ((strcmp(argv[1], "swap") == 0) ||
> >                  (strcmp(argv[1], "rename") == 0)) {
> >               ret = do_rename_gpt_parts(blk_dev_desc, argv[1], argv[4],
> argv[5]);
> > @@ -1028,8 +1057,9 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
> >       " gpt guid mmc 0 varname\n"
> >   #ifdef CONFIG_CMD_GPT_RENAME
> >       "gpt partition renaming commands:\n"
> > -     " gpt read <interface> <dev>\n"
> > +     " gpt read <interface> <dev> [<varname>]\n"
> >       "    - read GPT into a data structure for manipulation\n"
> > +     "    - read GPT partitions into environment variable\n"
>
> Where is your update for doc/README.gpt?
>
> Best regards
>
> Heinrich
>
> >       " gpt swap <interface> <dev> <name1> <name2>\n"
> >       "    - change all partitions named name1 to name2\n"
> >       "      and vice-versa\n"
> >
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4203 bytes
Desc: S/MIME Cryptographic Signature
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210225/d90bba7a/attachment.bin>


More information about the U-Boot mailing list