diff mbox

[4/4] mtd: warn when registering the same master many times

Message ID 1433200640-17858-4-git-send-email-computersforpeace@gmail.com
State Accepted
Headers show

Commit Message

Brian Norris June 1, 2015, 11:17 p.m. UTC
When CONFIG_MTD_PARTITIONED_MASTER=y, it is fatal to call
mtd_device_parse_register() twice on the same MTD, as we try to register
the same device/kobject multipile times.

When CONFIG_MTD_PARTITIONED_MASTER=n, calling
mtd_device_parse_register() is more of just a nuisance, as we can mostly
navigate around any conflicting actions.

But anyway, doing so is a Bad Thing (TM), and we should complain loudly
for any drivers that try to do this.

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
---
 drivers/mtd/mtdcore.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Richard Weinberger June 2, 2015, 8:03 a.m. UTC | #1
Am 02.06.2015 um 01:17 schrieb Brian Norris:
> When CONFIG_MTD_PARTITIONED_MASTER=y, it is fatal to call
> mtd_device_parse_register() twice on the same MTD, as we try to register
> the same device/kobject multipile times.
> 
> When CONFIG_MTD_PARTITIONED_MASTER=n, calling
> mtd_device_parse_register() is more of just a nuisance, as we can mostly
> navigate around any conflicting actions.
> 
> But anyway, doing so is a Bad Thing (TM), and we should complain loudly
> for any drivers that try to do this.
> 
> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
> ---
>  drivers/mtd/mtdcore.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 03eec42dc715..f0e157e0be89 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -387,6 +387,14 @@ int add_mtd_device(struct mtd_info *mtd)
>  	struct mtd_notifier *not;
>  	int i, error;
>  
> +	/*
> +	 * May occur, for instance, on buggy drivers which call
> +	 * mtd_device_parse_register() multiple times on the same master MTD,
> +	 * especially with CONFIG_MTD_PARTITIONED_MASTER=y.
> +	 */
> +	if (WARN(mtd->backing_dev_info, "MTD already registered\n"))
> +		return -EEXIST;
> +
>  	mtd->backing_dev_info = &mtd_bdi;
>  
>  	BUG_ON(mtd->writesize == 0);
> @@ -597,6 +605,7 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
>  	 * does cause problems with parse_mtd_partitions() above (e.g.,
>  	 * cmdlineparts will register partitions more than once).
>  	 */
> +	WARN(mtd->reboot_notifier.notifier_call, "MTD already registered\n");
>  	if (mtd->_reboot && !mtd->reboot_notifier.notifier_call) {
>  		mtd->reboot_notifier.notifier_call = mtd_reboot_notifier;
>  		register_reboot_notifier(&mtd->reboot_notifier);

One minor nit, IMHO WARN_ONCE() would make more sense.

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

Thanks,
//richard
Brian Norris Oct. 26, 2015, 9:35 p.m. UTC | #2
On Tue, Jun 02, 2015 at 10:03:10AM +0200, Richard Weinberger wrote:
> Am 02.06.2015 um 01:17 schrieb Brian Norris:
> > When CONFIG_MTD_PARTITIONED_MASTER=y, it is fatal to call
> > mtd_device_parse_register() twice on the same MTD, as we try to register
> > the same device/kobject multipile times.
> > 
> > When CONFIG_MTD_PARTITIONED_MASTER=n, calling
> > mtd_device_parse_register() is more of just a nuisance, as we can mostly
> > navigate around any conflicting actions.
> > 
> > But anyway, doing so is a Bad Thing (TM), and we should complain loudly
> > for any drivers that try to do this.
> > 
> > Signed-off-by: Brian Norris <computersforpeace@gmail.com>
> > ---
> >  drivers/mtd/mtdcore.c | 9 +++++++++
> >  1 file changed, 9 insertions(+)
> > 
> > diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> > index 03eec42dc715..f0e157e0be89 100644
> > --- a/drivers/mtd/mtdcore.c
> > +++ b/drivers/mtd/mtdcore.c
> > @@ -387,6 +387,14 @@ int add_mtd_device(struct mtd_info *mtd)
> >  	struct mtd_notifier *not;
> >  	int i, error;
> >  
> > +	/*
> > +	 * May occur, for instance, on buggy drivers which call
> > +	 * mtd_device_parse_register() multiple times on the same master MTD,
> > +	 * especially with CONFIG_MTD_PARTITIONED_MASTER=y.
> > +	 */
> > +	if (WARN(mtd->backing_dev_info, "MTD already registered\n"))
> > +		return -EEXIST;
> > +
> >  	mtd->backing_dev_info = &mtd_bdi;
> >  
> >  	BUG_ON(mtd->writesize == 0);
> > @@ -597,6 +605,7 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
> >  	 * does cause problems with parse_mtd_partitions() above (e.g.,
> >  	 * cmdlineparts will register partitions more than once).
> >  	 */
> > +	WARN(mtd->reboot_notifier.notifier_call, "MTD already registered\n");
> >  	if (mtd->_reboot && !mtd->reboot_notifier.notifier_call) {
> >  		mtd->reboot_notifier.notifier_call = mtd_reboot_notifier;
> >  		register_reboot_notifier(&mtd->reboot_notifier);
> 
> One minor nit, IMHO WARN_ONCE() would make more sense.
> 
> Beside of that:
> Reviewed-by: Richard Weinberger <richard@nod.at>

Changed to WARN_ONCE() and applied
diff mbox

Patch

diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 03eec42dc715..f0e157e0be89 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -387,6 +387,14 @@  int add_mtd_device(struct mtd_info *mtd)
 	struct mtd_notifier *not;
 	int i, error;
 
+	/*
+	 * May occur, for instance, on buggy drivers which call
+	 * mtd_device_parse_register() multiple times on the same master MTD,
+	 * especially with CONFIG_MTD_PARTITIONED_MASTER=y.
+	 */
+	if (WARN(mtd->backing_dev_info, "MTD already registered\n"))
+		return -EEXIST;
+
 	mtd->backing_dev_info = &mtd_bdi;
 
 	BUG_ON(mtd->writesize == 0);
@@ -597,6 +605,7 @@  int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
 	 * does cause problems with parse_mtd_partitions() above (e.g.,
 	 * cmdlineparts will register partitions more than once).
 	 */
+	WARN(mtd->reboot_notifier.notifier_call, "MTD already registered\n");
 	if (mtd->_reboot && !mtd->reboot_notifier.notifier_call) {
 		mtd->reboot_notifier.notifier_call = mtd_reboot_notifier;
 		register_reboot_notifier(&mtd->reboot_notifier);