[U-Boot] [PATCH v2] tools/env: fix environment alignment tests for block devices

Andreas Fenkart andreas.fenkart at digitalstrom.com
Mon Nov 28 10:47:10 CET 2016


Hi Max,

LGTM, see one nit below, can fixed later

On 11/19/2016 01:58 PM, Max Krummenacher wrote:
> commit 183923d3e412500bdc597d1745e2fb6f7f679ec7 enforces that the
> environment must start at an erase block boundary.
>
> For block devices the sample fw_env.config does not mandate a erase block size
> for block devices. A missing setting defaults to the full env size.
>
> Depending on the environment location the alignment check now errors out for
> perfectly legal settings.
>
> Fix this by defaulting to the standard blocksize of 0x200 for environments
> stored in a block device.
> That keeps the fw_env.config files for block devices working even with that
> new check.
>
> Signed-off-by: Max Krummenacher <max.krummenacher at toradex.com>
>
> ---
>
> Changes in v2:
> - move default value handling from parse_config(), get_config() to
>    check_device_config(), so that !defined(CONFIG_FILE) is covered also.
> - use DIV_ROUND_UP instead of doing this manually
> - move the check after the setting of default values in check_device_config().
> - use 0 as the marker for default values to be used.
>
>   tools/env/fw_env.c | 60 ++++++++++++++++++++++++++++++------------------------
>   1 file changed, 33 insertions(+), 27 deletions(-)
>
> diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
> index 3dc0d53..862a0b1 100644
> --- a/tools/env/fw_env.c
> +++ b/tools/env/fw_env.c
> @@ -1291,18 +1291,6 @@ static int check_device_config(int dev)
>   	struct stat st;
>   	int fd, rc = 0;
>   
> -	if (DEVOFFSET(dev) % DEVESIZE(dev) != 0) {
> -		fprintf(stderr, "Environment does not start on (erase) block boundary\n");
> -		errno = EINVAL;
> -		return -1;
> -	}
> -
> -	if (ENVSIZE(dev) > ENVSECTORS(dev) * DEVESIZE(dev)) {
> -		fprintf(stderr, "Environment does not fit into available sectors\n");
> -		errno = EINVAL;
> -		return -1;
> -	}
> -
>   	fd = open(DEVNAME(dev), O_RDONLY);
>   	if (fd < 0) {
>   		fprintf(stderr,
> @@ -1335,9 +1323,15 @@ static int check_device_config(int dev)
>   			goto err;
>   		}
>   		DEVTYPE(dev) = mtdinfo.type;
> +		if (DEVESIZE(dev) == 0)
> +			/* Assume the erase size is the same as the env-size */
> +			DEVESIZE(dev) = ENVSIZE(dev);
Since we already checked for character devices, we could use the 
mtdinfo.erasesize. I guess we can relay on mtdinfo on new kernels, and 
if not there is still the fallback to specify it in fw_env.config.

>   	} else {
>   		uint64_t size;
>   		DEVTYPE(dev) = MTD_ABSENT;
> +		if (DEVESIZE(dev) == 0)
> +			/* Assume the erase size to be 512 bytes */
> +			DEVESIZE(dev) = 0x200;
It doesn't even matter. In case of MTD_ABSENT, erasize is never used 
itself, only the tuple (DEVESIZE * ENVSECTORS) matters.

>   
>   		/*
>   		 * Check for negative offsets, treat it as backwards offset
> @@ -1359,6 +1353,22 @@ static int check_device_config(int dev)
>   		}
>   	}
>   
> +	if (ENVSECTORS(dev) == 0)
> +		/* Assume enough sectors to cover the environment */
> +		ENVSECTORS(dev) = DIV_ROUND_UP(ENVSIZE(dev), DEVESIZE(dev));
> +
> +	if (DEVOFFSET(dev) % DEVESIZE(dev) != 0) {
> +		fprintf(stderr, "Environment does not start on (erase) block boundary\n");
> +		errno = EINVAL;
> +		return -1;
> +	}
> +
> +	if (ENVSIZE(dev) > ENVSECTORS(dev) * DEVESIZE(dev)) {
> +		fprintf(stderr, "Environment does not fit into available sectors\n");
> +		errno = EINVAL;
> +		return -1;
> +	}
> +
>   err:
>   	close(fd);
>   	return rc;
> @@ -1382,10 +1392,10 @@ static int parse_config(struct env_opts *opts)
>   	DEVNAME (0) = DEVICE1_NAME;
>   	DEVOFFSET (0) = DEVICE1_OFFSET;
>   	ENVSIZE (0) = ENV1_SIZE;
> -	/* Default values are: erase-size=env-size */
> -	DEVESIZE (0) = ENVSIZE (0);
> -	/* #sectors=env-size/erase-size (rounded up) */
> -	ENVSECTORS (0) = (ENVSIZE(0) + DEVESIZE(0) - 1) / DEVESIZE(0);
> +
> +	/* Set defaults for DEVESIZE, ENVSECTORS later once we
> +	 * know DEVTYPE
> +	 */
>   #ifdef DEVICE1_ESIZE
>   	DEVESIZE (0) = DEVICE1_ESIZE;
>   #endif
> @@ -1397,10 +1407,10 @@ static int parse_config(struct env_opts *opts)
>   	DEVNAME (1) = DEVICE2_NAME;
>   	DEVOFFSET (1) = DEVICE2_OFFSET;
>   	ENVSIZE (1) = ENV2_SIZE;
> -	/* Default values are: erase-size=env-size */
> -	DEVESIZE (1) = ENVSIZE (1);
> -	/* #sectors=env-size/erase-size (rounded up) */
> -	ENVSECTORS (1) = (ENVSIZE(1) + DEVESIZE(1) - 1) / DEVESIZE(1);
> +
> +	/* Set defaults for DEVESIZE, ENVSECTORS later once we
> +	 * know DEVTYPE
> +	 */
>   #ifdef DEVICE2_ESIZE
>   	DEVESIZE (1) = DEVICE2_ESIZE;
>   #endif
> @@ -1466,13 +1476,9 @@ static int get_config (char *fname)
>   
>   		DEVNAME(i) = devname;
>   
> -		if (rc < 4)
> -			/* Assume the erase size is the same as the env-size */
> -			DEVESIZE(i) = ENVSIZE(i);
> -
> -		if (rc < 5)
> -			/* Assume enough env sectors to cover the environment */
> -			ENVSECTORS (i) = (ENVSIZE(i) + DEVESIZE(i) - 1) / DEVESIZE(i);
> +		/* Set defaults for DEVESIZE, ENVSECTORS later once we
> +		 * know DEVTYPE
> +		 */
>   
>   		i++;
>   	}



More information about the U-Boot mailing list