[4/5] MTD: implement mtd_get_unmapped_area() using the point method

Message ID 20171011032621.26979-5-nicolas.pitre@linaro.org
State Superseded
Headers show
Series
  • unconfuse get_unmapped_area and point/unpoint driver methods
Related show

Commit Message

Nicolas Pitre Oct. 11, 2017, 3:26 a.m.
The mtd->_point method is a superset of mtd->_get_unmapped_area.
Especially in the NOR flash case, the point method ensures the flash
memory is in array (data) mode and that it will stay that way which
is precisely what callers of mtd_get_unmapped_area() would expect.

Implement mtd_get_unmapped_area() in terms of mtd->_point now that all
drivers that provided a _get_unmapped_area method also have the _point
method implemented.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
---
 drivers/mtd/mtdcore.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

Comments

Richard Weinberger Oct. 11, 2017, 8:51 p.m. | #1
On Wed, Oct 11, 2017 at 5:26 AM, Nicolas Pitre <nicolas.pitre@linaro.org> wrote:
> The mtd->_point method is a superset of mtd->_get_unmapped_area.
> Especially in the NOR flash case, the point method ensures the flash
> memory is in array (data) mode and that it will stay that way which
> is precisely what callers of mtd_get_unmapped_area() would expect.
>
> Implement mtd_get_unmapped_area() in terms of mtd->_point now that all
> drivers that provided a _get_unmapped_area method also have the _point
> method implemented.
>
> Signed-off-by: Nicolas Pitre <nico@linaro.org>
> ---
>  drivers/mtd/mtdcore.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index e7ea842ba3..ecb0380158 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -1022,11 +1022,18 @@ EXPORT_SYMBOL_GPL(mtd_unpoint);
>  unsigned long mtd_get_unmapped_area(struct mtd_info *mtd, unsigned long len,
>                                     unsigned long offset, unsigned long flags)
>  {
> -       if (!mtd->_get_unmapped_area)
> -               return -EOPNOTSUPP;
> -       if (offset >= mtd->size || len > mtd->size - offset)
> -               return -EINVAL;
> -       return mtd->_get_unmapped_area(mtd, len, offset, flags);
> +       size_t retlen;
> +       void *virt;
> +       int ret;
> +
> +       ret = mtd_point(mtd, offset, len, &retlen, &virt, NULL);
> +       if (ret)
> +               return ret;
> +       if (retlen != len) {
> +               mtd_unpoint(mtd, offset, retlen);
> +               return -ENOSYS;
> +       }
> +       return (unsigned long)virt;
>  }
>  EXPORT_SYMBOL_GPL(mtd_get_unmapped_area);

Reviewed-by: Richard Weinberger <richard@nod.at>

Patch

diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index e7ea842ba3..ecb0380158 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -1022,11 +1022,18 @@  EXPORT_SYMBOL_GPL(mtd_unpoint);
 unsigned long mtd_get_unmapped_area(struct mtd_info *mtd, unsigned long len,
 				    unsigned long offset, unsigned long flags)
 {
-	if (!mtd->_get_unmapped_area)
-		return -EOPNOTSUPP;
-	if (offset >= mtd->size || len > mtd->size - offset)
-		return -EINVAL;
-	return mtd->_get_unmapped_area(mtd, len, offset, flags);
+	size_t retlen;
+	void *virt;
+	int ret;
+
+	ret = mtd_point(mtd, offset, len, &retlen, &virt, NULL);
+	if (ret)
+		return ret;
+	if (retlen != len) {
+		mtd_unpoint(mtd, offset, retlen);
+		return -ENOSYS;
+	}
+	return (unsigned long)virt;
 }
 EXPORT_SYMBOL_GPL(mtd_get_unmapped_area);