[bug report] mtd: plat_nand: request memory resource before doing ioremap

Boris Brezillon boris.brezillon at bootlin.com
Tue Feb 20 01:07:59 PST 2018


Hi Dan,

On Tue, 20 Feb 2018 11:41:15 +0300
Dan Carpenter <dan.carpenter at oracle.com> wrote:

> [  This is really weird that Smatch is complaining about ancient code
>    today.  No idea why.  - dan ]

Probably because I moved NAND code around recently.

> 
> Hello H Hartley Sweeten,
> 
> The patch 2d098a725333: "mtd: plat_nand: request memory resource
> before doing ioremap" from Oct 19, 2009, leads to the following
> static checker warning:
> 
> 	drivers/mtd/nand/raw/plat_nand.c:100 plat_nand_probe()
> 	info: return a literal instead of 'err'

Hm, I don't really get this error message? What's wrong with returning
err when it's 0? It's true that we could return 0 directly, but I don't
see it as a real issue. Am I missing something?

> 
> drivers/mtd/nand/raw/plat_nand.c
>     78  
>     79          platform_set_drvdata(pdev, data);
>     80  
>     81          /* Handle any platform specific setup */
>     82          if (pdata->ctrl.probe) {
>     83                  err = pdata->ctrl.probe(pdev);
>     84                  if (err)
>     85                          goto out;
>     86          }
>     87  
>     88          /* Scan to find existence of the device */
>     89          err = nand_scan(mtd, pdata->chip.nr_chips);
>     90          if (err)
>     91                  goto out;
>     92  
>     93          part_types = pdata->chip.part_probe_types;
>     94  
>     95          err = mtd_device_parse_register(mtd, part_types, NULL,
>     96                                          pdata->chip.partitions,
>     97                                          pdata->chip.nr_partitions);
>     98  
>     99          if (!err)
>    100                  return err;
>                 ^^^^^^^^^^^^^^^^^^^
> 
> Ugh...  Success handling.  There seems to be a lot of it in this
> subsystem.  :(

Yep, there's a lot of ancient code that no one dares to touch in the
fear that it may break things. Also, there's so many old drivers that
cleaning up everything would take a lot of time.

> 
>    101  
>    102          nand_release(mtd);
>                              ^^^
> This call to nand_release() makes no sense.  It calls unregister but
> mtd_device_parse_register() failed.

You're right, we should call nand_cleanup() here. This being said,
calling mtd_device_unregister() should be harmless because of this test
[1].

To sum-up, this code is definitely not meeting the kernel standards in
term of code quality, but it doesn't seem to be buggy either.

Regards,

Boris

[1]https://elixir.bootlin.com/linux/v4.8/source/drivers/mtd/mtdcore.c#L664

-- 
Boris Brezillon, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
http://bootlin.com



More information about the linux-mtd mailing list