[PATCH for-4.4] mtd: fix cmdlinepart parser, early naming for auto-filled MTD

Heiko Schocher hs at denx.de
Fri Dec 11 20:45:21 PST 2015


Hello Brian,

Am 12.12.2015 um 00:58 schrieb Brian Norris:
> Commit 807f16d4db95 ("mtd: core: set some defaults when dev.parent is
> set") attempted to provide some default settings for MTDs that
>   (a) assign the parent device and
>   (b) don't provide their own name or owner
>
> However, this isn't a perfect drop-in replacement for the boilerplate
> found in some drivers, because the MTD name is used by partition
> parsers like cmdlinepart, but the name isn't set until add_mtd_device(),
> after the parsing is completed. This means cmdlinepart sees a NULL name
> and therefore will not work properly.
>
> Fix this by moving the default name and owner assignment to be first in
> the MTD registration process.
>
> Fixes: 807f16d4db95 ("mtd: core: set some defaults when dev.parent is set")
> Reported-by: Heiko Schocher <hs at denx.de>
> Signed-off-by: Brian Norris <computersforpeace at gmail.com>
> Cc: Heiko Schocher <hs at denx.de>
> Cc: Frans Klaver <fransklaver at gmail.com>
> ---
> Heiko, can you provide testing feedback (e.g., 'Tested-by: ...')?

Sorry, does not work for me:

Based on:
pollux:linux hs [20151212] $ git describe master
v4.4-rc4-135-gb9d8545

and this patch, shows the same problem,

Adding:
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 93f664c..28dcf66 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1685,6 +1685,7 @@ static int omap_nand_probe(struct platform_device *pdev)
         info->ecc_opt           = pdata->ecc_opt;
         mtd                     = &info->mtd;
         mtd->priv               = &info->nand;
+       mtd->name               = dev_name(&pdev->dev);
         mtd->dev.parent         = &pdev->dev;
         nand_chip               = &info->nand;
         nand_chip->ecc.priv     = NULL;

and it works again ...

bye,
Heiko
>
> In testing this myself, it looks like cmdlinepart.c can actually work OK with a
> single-MTD system, even when mtd->name isn't set. See this snippet:
>
>          /*
>           * Search for the partition definition matching master->name.
>           * If master->name is not set, stop at first partition definition.
>           */
>          for (part = partitions; part; part = part->next) {
>                  if ((!mtd_id) || (!strcmp(part->mtd_id, mtd_id)))
>                          break;
>          }
>
> But, I don't know *why* it does that...
>
>   drivers/mtd/mtdcore.c | 26 +++++++++++++++++---------
>   1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 95c13b2ffa79..ffa288474820 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -426,15 +426,6 @@ int add_mtd_device(struct mtd_info *mtd)
>   	mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1;
>   	mtd->writesize_mask = (1 << mtd->writesize_shift) - 1;
>
> -	if (mtd->dev.parent) {
> -		if (!mtd->owner && mtd->dev.parent->driver)
> -			mtd->owner = mtd->dev.parent->driver->owner;
> -		if (!mtd->name)
> -			mtd->name = dev_name(mtd->dev.parent);
> -	} else {
> -		pr_debug("mtd device won't show a device symlink in sysfs\n");
> -	}
> -
>   	/* Some chips always power up locked. Unlock them now */
>   	if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) {
>   		error = mtd_unlock(mtd, 0, mtd->size);
> @@ -549,6 +540,21 @@ static int mtd_add_device_partitions(struct mtd_info *mtd,
>   	return 0;
>   }
>
> +/*
> + * Set a few defaults based on the parent devices, if not provided by the
> + * driver
> + */
> +static void mtd_set_dev_defaults(struct mtd_info *mtd)
> +{
> +	if (mtd->dev.parent) {
> +		if (!mtd->owner && mtd->dev.parent->driver)
> +			mtd->owner = mtd->dev.parent->driver->owner;
> +		if (!mtd->name)
> +			mtd->name = dev_name(mtd->dev.parent);
> +	} else {
> +		pr_debug("mtd device won't show a device symlink in sysfs\n");
> +	}
> +}
>
>   /**
>    * mtd_device_parse_register - parse partitions and register an MTD device.
> @@ -587,6 +593,8 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
>   	int ret;
>   	struct mtd_partition *real_parts = NULL;
>
> +	mtd_set_dev_defaults(mtd);
> +
>   	ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data);
>   	if (ret <= 0 && nr_parts && parts) {
>   		real_parts = kmemdup(parts, sizeof(*parts) * nr_parts,
>

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
		



More information about the linux-mtd mailing list