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

Cyril Bur cyril.bur at au1.ibm.com
Wed Apr 19 14:39:04 AEST 2017


On Wed, 2017-04-19 at 14:34 +1000, Samuel Mendoza-Jonas wrote:
> 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?

Oops, yes.

Thanks!

> 
> > +		}
> > +	}
> >  
> >  	return 0;
> >  }
> 
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot



More information about the Skiboot mailing list