All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Wolfram Sang <w.sang@pengutronix.de>
Cc: barebox@lists.infradead.org
Subject: Re: [RFC 04/10] devfs & mtd: add MEMERASE ioctl support
Date: Sat, 27 Oct 2012 14:33:58 +0200	[thread overview]
Message-ID: <20121027123358.GF1641@pengutronix.de> (raw)
In-Reply-To: <1351246602-8859-5-git-send-email-w.sang@pengutronix.de>

On Fri, Oct 26, 2012 at 12:16:36PM +0200, Wolfram Sang wrote:
> To make that, we need to shift mtd_erase before mtd_ioctl.
> ubi-utils need that, especially ubiformat.
> 
> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
> ---
>  drivers/mtd/core.c |   68 +++++++++++++++++++++++++++-------------------------
>  fs/devfs-core.c    |    3 ++-
>  2 files changed, 37 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
> index 7c323a1..aca4f13 100644
> --- a/drivers/mtd/core.c
> +++ b/drivers/mtd/core.c
> @@ -114,7 +114,37 @@ static ssize_t mtd_write(struct cdev* cdev, const void *buf, size_t _count,
>  out:
>  	return ret ? ret : _count;
>  }
> -#endif
> +
> +static int mtd_erase(struct cdev *cdev, size_t count, loff_t offset)
> +{
> +	struct mtd_info *mtd = cdev->priv;
> +	struct erase_info erase;
> +	int ret;
> +
> +	memset(&erase, 0, sizeof(erase));
> +	erase.mtd = mtd;
> +	erase.addr = offset;
> +	erase.len = mtd->erasesize;
> +
> +	while (count > 0) {
> +		dev_dbg(cdev->dev, "erase %d %d\n", erase.addr, erase.len);
> +
> +		ret = mtd->block_isbad(mtd, erase.addr);
> +		if (ret > 0) {
> +			printf("Skipping bad block at 0x%08x\n", erase.addr);
> +		} else {
> +			ret = mtd->erase(mtd, &erase);
> +			if (ret)
> +				return ret;
> +		}
> +
> +		erase.addr += mtd->erasesize;
> +		count -= count > mtd->erasesize ? mtd->erasesize : count;
> +	}
> +
> +	return 0;
> +}
> +#endif /* CONFIG_MTD_WRITE */
>  
>  int mtd_ioctl(struct cdev *cdev, int request, void *buf)
>  {
> @@ -125,6 +155,7 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf)
>  	struct mtd_ecc_stats *ecc = buf;
>  #endif
>  	struct region_info_user *reg = buf;
> +	struct erase_info_user *ei = buf;
>  	loff_t *offset = buf;
>  
>  	switch (request) {
> @@ -137,6 +168,9 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf)
>  		dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08llx\n", *offset);
>  		ret = mtd->block_markbad(mtd, *offset);
>  		break;
> +	case MEMERASE:
> +		ret = mtd_erase(cdev, ei->length, ei->start + cdev->offset);
> +		break;

Please check this compiles with CONFIG_MTD_WRITE disabled.

>  #endif
>  	case MEMGETINFO:
>  		user->type	= mtd->type;
> @@ -174,38 +208,6 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf)
>  	return ret;
>  }
>  
> -#ifdef CONFIG_MTD_WRITE
> -static int mtd_erase(struct cdev *cdev, size_t count, loff_t offset)
> -{
> -	struct mtd_info *mtd = cdev->priv;
> -	struct erase_info erase;
> -	int ret;
> -
> -	memset(&erase, 0, sizeof(erase));
> -	erase.mtd = mtd;
> -	erase.addr = offset;
> -	erase.len = mtd->erasesize;
> -
> -	while (count > 0) {
> -		dev_dbg(cdev->dev, "erase %d %d\n", erase.addr, erase.len);
> -
> -		ret = mtd->block_isbad(mtd, erase.addr);
> -		if (ret > 0) {
> -			printf("Skipping bad block at 0x%08x\n", erase.addr);
> -		} else {
> -			ret = mtd->erase(mtd, &erase);
> -			if (ret)
> -				return ret;
> -		}
> -
> -		erase.addr += mtd->erasesize;
> -		count -= count > mtd->erasesize ? mtd->erasesize : count;
> -	}
> -
> -	return 0;
> -}
> -#endif
> -
>  static struct file_operations mtd_ops = {
>  	.read   = mtd_read,
>  #ifdef CONFIG_MTD_WRITE
> diff --git a/fs/devfs-core.c b/fs/devfs-core.c
> index 0d2f75a..262e0a2 100644
> --- a/fs/devfs-core.c
> +++ b/fs/devfs-core.c
> @@ -152,13 +152,14 @@ static int partition_ioctl(struct cdev *cdev, int request, void *buf)
>  		break;
>  #if (defined(CONFIG_NAND_ECC_HW) || defined(CONFIG_NAND_ECC_SOFT))
>  	case ECCGETSTATS:
> +#endif
> +	case MEMERASE:
>  		if (!cdev->ops->ioctl) {
>  			ret = -EINVAL;
>  			break;
>  		}
>  		ret = cdev->ops->ioctl(cdev, request, buf);
>  		break;

Are you sure this works for partitions? I assume you have to take
cdev->offset into account like for example the MEMGETBADBLOCK ioctl
does.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  reply	other threads:[~2012-10-27 12:34 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-26 10:16 [RFC 00/10] ubiformat in barebox Wolfram Sang
2012-10-26 10:16 ` [RFC 01/10] mtd: move is_power_of_2() to a public place Wolfram Sang
2012-10-26 10:16 ` [RFC 02/10] ubi: consolidate ubi-media.h Wolfram Sang
2012-10-26 10:16 ` [RFC 03/10] ubi: bump ubi-media.h to newest version Wolfram Sang
2012-10-26 10:16 ` [RFC 04/10] devfs & mtd: add MEMERASE ioctl support Wolfram Sang
2012-10-27 12:33   ` Sascha Hauer [this message]
2012-12-09 19:36     ` Wolfram Sang
2012-10-26 10:16 ` [RFC 05/10] mtd: utils: apply macros for message printouts Wolfram Sang
2012-10-26 10:16 ` [RFC 06/10] lib: add ubiutils-common Wolfram Sang
2012-10-26 10:16 ` [RFC 07/10] lib: add libscan Wolfram Sang
2012-10-26 10:16 ` [RFC 08/10] lib: add libubigen Wolfram Sang
2012-10-26 10:16 ` [RFC 09/10] lib: add barebox version of libmtd Wolfram Sang
2012-10-27 20:11   ` Jean-Christophe PLAGNIOL-VILLARD
2012-12-09 19:38     ` Wolfram Sang
2012-10-26 10:16 ` [RFC 10/10] commands: add ubiformat Wolfram Sang
2012-10-27 12:57   ` Sascha Hauer
2012-12-09 19:40     ` Wolfram Sang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121027123358.GF1641@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=w.sang@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.