[Skiboot] [PATCH v2 1/5] libflash/file: Only use 64bit MTD erase ioctl() when needed

Samuel Mendoza-Jonas sam at mendozajonas.com
Wed Apr 19 14:34:34 AEST 2017


On Wed, 2017-04-19 at 14:11 +1000, Cyril Bur wrote:
> Commit e5720d3fe94f5b85c374520b89fb8fbb2143df94 introduced using the
> 64bit MTD erase ioctl() after a rework of blocklevel to make it fully
> 64bit safe. It turns out that not all kernels on which pflash might run
> actually have the 64bit MTD ioctl(), this is probably due to the kernel
> being based off 2.6.28.10.
> 
> This patch addresses this by only using the 64bit version of the erase
> ioctl() if the parameters exceed 32bit in size.
> 
> Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> ---
>  libflash/file.c | 35 +++++++++++++++++++++++++++++------
>  1 file changed, 29 insertions(+), 6 deletions(-)
> 
> diff --git a/libflash/file.c b/libflash/file.c
> index 5f074cf2..a4d4fe10 100644
> --- a/libflash/file.c
> +++ b/libflash/file.c
> @@ -15,6 +15,7 @@
>   */
>  #define _GNU_SOURCE
>  #include <errno.h>
> +#include <inttypes.h>
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <string.h>
> @@ -130,13 +131,35 @@ static int file_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)
>  static int mtd_erase(struct blocklevel_device *bl, uint64_t dst, uint64_t len)
>  {
>  	struct file_data *file_data = container_of(bl, struct file_data, bl);
> -	struct erase_info_user64 erase_info = {
> -		.start = dst,
> -		.length = len
> -	};
>  
> -	if (ioctl(file_data->fd, MEMERASE64, &erase_info) == -1)
> -		return FLASH_ERR_PARM_ERROR;
> +	FL_DBG("%s: dst: 0x%" PRIx64 ", len: 0x%" PRIx64 "\n", __func__, dst, len);
> +
> +	/*
> +	 * Some kernels that pflash supports do not know about the 64bit
> +	 * version of the IOCTL therefore we'll just use the 32bit (which
> +	 * should always be supported...) unless we MUST use the 64bit and
> +	 * then lets just hope the kernel knows how to deal with it
> +	 */
> +	if (dst > UINT_MAX || len > UINT_MAX) {
> +		struct erase_info_user64 erase_info = {
> +			.start = dst,
> +			.length = len
> +		};
> +
> +		if (ioctl(file_data->fd, MEMERASE64, &erase_info) == -1)
> +			return FLASH_ERR_PARM_ERROR;
> +	} else {
> +		struct erase_info_user erase_info = {
> +			.start = dst,
> +			.length = len
> +		};
> +		if (ioctl(file_data->fd, MEMERASE, &erase_info) == -1) {
> +			if (errno == 25) /* Kernel doesn't do 64 MTD ioctl() */
> +				FL_DBG("Attempted a 64bit erase on a kernel which doesn't support it\n");
> +			FL_ERR("%s: IOCTL to kernel failed! %s\n", __func__, strerror(errno));
> +			return FLASH_ERR_PARM_ERROR;

This error should be after the MEMERASE_64 ioctl right, not the 32 bit
one?

> +		}
> +	}
>  
>  	return 0;
>  }



More information about the Skiboot mailing list