All of lore.kernel.org
 help / color / mirror / Atom feed
* [bug report] mtd: plat_nand: request memory resource before doing ioremap
@ 2018-02-20  8:41 Dan Carpenter
  2018-02-20  9:07 ` Boris Brezillon
  0 siblings, 1 reply; 3+ messages in thread
From: Dan Carpenter @ 2018-02-20  8:41 UTC (permalink / raw)
  To: hartleys; +Cc: Richard Weinberger, linux-mtd

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

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'

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.  :(

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

   103  out:
   104          if (pdata->ctrl.remove)
   105                  pdata->ctrl.remove(pdev);
   106          return err;
   107  }

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [bug report] mtd: plat_nand: request memory resource before doing ioremap
  2018-02-20  8:41 [bug report] mtd: plat_nand: request memory resource before doing ioremap Dan Carpenter
@ 2018-02-20  9:07 ` Boris Brezillon
  2018-02-20  9:36   ` Dan Carpenter
  0 siblings, 1 reply; 3+ messages in thread
From: Boris Brezillon @ 2018-02-20  9:07 UTC (permalink / raw)
  To: Dan Carpenter; +Cc: hartleys, Richard Weinberger, linux-mtd

Hi Dan,

On Tue, 20 Feb 2018 11:41:15 +0300
Dan Carpenter <dan.carpenter@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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [bug report] mtd: plat_nand: request memory resource before doing ioremap
  2018-02-20  9:07 ` Boris Brezillon
@ 2018-02-20  9:36   ` Dan Carpenter
  0 siblings, 0 replies; 3+ messages in thread
From: Dan Carpenter @ 2018-02-20  9:36 UTC (permalink / raw)
  To: Boris Brezillon; +Cc: hartleys, Richard Weinberger, linux-mtd

On Tue, Feb 20, 2018 at 10:07:59AM +0100, Boris Brezillon wrote:
> Hi Dan,
> 
> On Tue, 20 Feb 2018 11:41:15 +0300
> Dan Carpenter <dan.carpenter@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?

There are a couple reasons.  Literals are more readable:

 	if (!ret)
-		return ret;
+		return 0;

But the main reason is that most of the time in the kernel we do
error handling instead of success handling.  So sometimes the '!'
character is just a typo.  This kind of bug would normally be caught
in testing unless we weren't able to test it or it's in a permission
check where we normally expect the function to just return zero.

> 
> > 
> > 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.
> 

Yes.  Of course.  I understand.

> > 
> >    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.
> 

Thanks for taking a look at this code.  I have looked at it some more
and you're obviously right that it works.  Part of what puzzled me, is
that I had no clue that nand_cleanup() went with nand_scan().  I sort of
figured from the context that we must be freeing something that
nand_scan() allocated, but it wasn't obvious.

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-02-20  9:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-20  8:41 [bug report] mtd: plat_nand: request memory resource before doing ioremap Dan Carpenter
2018-02-20  9:07 ` Boris Brezillon
2018-02-20  9:36   ` Dan Carpenter

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.