[U-Boot] [PATCH] gpt: support random UUIDs without setting environment variables

Przemyslaw Marczak p.marczak at samsung.com
Wed Feb 18 18:48:24 CET 2015


Hello Rob,

Sorry for delay.

On 01/26/2015 04:44 PM, Rob Herring wrote:
> Currently, an environment variable must be used to store the randomly
> generated UUID for each partition. This is not necessary, so make storing
> the UUID optional. Now passing uuid_disk and uuid are optional when random
> UUIDs are enabled.
>
> Signed-off-by: Rob Herring <robh at kernel.org>
> ---
>   common/cmd_gpt.c | 48 ++++++++++++++++++++++++++++++------------------
>   doc/README.gpt   |  8 +++++---
>   2 files changed, 35 insertions(+), 21 deletions(-)
>
> diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c
> index 75df3fe..c56fe15 100644
> --- a/common/cmd_gpt.c
> +++ b/common/cmd_gpt.c
> @@ -154,17 +154,24 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
>
>   	/* extract disk guid */
>   	s = str;
> -	tok = strsep(&s, ";");
> -	val = extract_val(tok, "uuid_disk");
> +	val = extract_val(str, "uuid_disk");
>   	if (!val) {

The code below is not required, since the same thing is done inside the 
extract_env() function.

> +#ifdef CONFIG_RANDOM_UUID
> +		*str_disk_guid = malloc(UUID_STR_LEN + 1);
> +		gen_rand_uuid_str(*str_disk_guid, UUID_STR_FORMAT_STD);
> +#else
>   		free(str);
>   		return -2;
> +#endif
> +	} else {
> +		val = strsep(&val, ";");
> +		if (extract_env(val, &p))
> +			p = val;
> +		*str_disk_guid = strdup(p);
> +		free(val);
> +		/* Move s to first partition */
> +		strsep(&s, ";");
>   	}
> -	if (extract_env(val, &p))
> -		p = val;
> -	*str_disk_guid = strdup(p);
> -	free(val);
> -
>   	if (strlen(s) == 0)
>   		return -3;
>
> @@ -192,20 +199,25 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
>
>   		/* uuid */
>   		val = extract_val(tok, "uuid");
> -		if (!val) { /* 'uuid' is mandatory */
> -			errno = -4;
> -			goto err;
> -		}
> -		if (extract_env(val, &p))
> -			p = val;
> -		if (strlen(p) >= sizeof(parts[i].uuid)) {
> -			printf("Wrong uuid format for partition %d\n", i);
> +		if (!val) {

The same in this place - code duplication.

> +			/* 'uuid' is optional if random uuid's are enabled */
> +#ifdef CONFIG_RANDOM_UUID
> +			gen_rand_uuid_str(parts[i].uuid, UUID_STR_FORMAT_STD);
> +#else
>   			errno = -4;
>   			goto err;
> +#endif
> +		} else {
> +			if (extract_env(val, &p))
> +				p = val;
> +			if (strlen(p) >= sizeof(parts[i].uuid)) {
> +				printf("Wrong uuid format for partition %d\n", i);
> +				errno = -4;
> +				goto err;
> +			}
> +			strcpy((char *)parts[i].uuid, p);
> +			free(val);
>   		}
> -		strcpy((char *)parts[i].uuid, p);
> -		free(val);
> -
>   		/* name */
>   		val = extract_val(tok, "name");
>   		if (!val) { /* name is mandatory */
> diff --git a/doc/README.gpt b/doc/README.gpt
> index ec0156d..59fdeeb 100644
> --- a/doc/README.gpt
> +++ b/doc/README.gpt
> @@ -157,11 +157,13 @@ To restore GUID partition table one needs to:
>        "partitions=uuid_disk=${uuid_gpt_disk};name=${uboot_name},
>   	size=${uboot_size},uuid=${uboot_uuid};"
>
> -   Fields 'name', 'size' and 'uuid' are mandatory for every partition.
> +   The fields 'name' and 'size' are mandatory for every partition.
>      The field 'start' is optional.
>
> -   option: CONFIG_RANDOM_UUID
> -   If any partition "UUID" no exists then it is randomly generated.
> +   The fields 'uuid' and 'uuid_disk' are optional if CONFIG_RANDOM_UUID is
> +   enabled. A random uuid will be used if omitted or they point to an empty/
> +   non-existent environment variable. The environment variable will be set to
> +   the generated UUID.

The things from the above comment are implemented at present in mainline.

>
>   2. Define 'CONFIG_EFI_PARTITION' and 'CONFIG_CMD_GPT'
>
>


If you want drop saving the uuid to env, then you can do it by modify 
the extract_env() function (diff):

+#ifdef CONFIG_RANDOM_UUID_SKIP_SETENV
+               e = strdup(uuid_str);
+#else
                 setenv(s, uuid_str);
-
                 e = getenv(s);
+#endif


I would prefer introduce the new config like *SKIP_SETENV*, rather than 
drop this feature at all, since somebody could use it.

Best regards,
-- 
Przemyslaw Marczak
Samsung R&D Institute Poland
Samsung Electronics
p.marczak at samsung.com


More information about the U-Boot mailing list