From: Jens Axboe on
On Mon, Apr 26 2010, J�rn Engel wrote:
> Otherwise we hit a BUG_ON in bdi_queue_work().
>
> Signed-off-by: Joern Engel <joern(a)logfs.org>
> ---
> drivers/mtd/mtdcore.c | 17 ++++++++++++++++-
> 1 files changed, 16 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index cb4858b..8dd3e46 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -322,6 +322,12 @@ int add_mtd_device(struct mtd_info *mtd)
> if (!mtd_table[i]) {
> struct mtd_notifier *not;
>
> + err = bdi_register(mtd->backing_dev_info, NULL, "mtd%d",
> + i);
> + if (err) {
> + /* We lose the errno information :( */
> + break;
> + }

This is not a good idea, even if it'll currently work.

> @@ -692,6 +698,15 @@ static int __init init_mtd(void)
> int ret;
> ret = class_register(&mtd_class);
>
> + ret = bdi_init(&mtd_bdi_unmappable);
> + if (ret)
> + return ret;
> + ret = bdi_init(&mtd_bdi_ro_mappable);
> + if (ret)
> + return ret;
> + ret = bdi_init(&mtd_bdi_rw_mappable);
> + if (ret)
> + return ret;

Do the bdi_register() here as well.

--
Jens Axboe

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Jörn Engel on
On Mon, 26 April 2010 19:02:48 +0200, Jens Axboe wrote:
> On Mon, Apr 26 2010, Jörn Engel wrote:
> > Otherwise we hit a BUG_ON in bdi_queue_work().
> >
> > Signed-off-by: Joern Engel <joern(a)logfs.org>
> > ---
> > drivers/mtd/mtdcore.c | 17 ++++++++++++++++-
> > 1 files changed, 16 insertions(+), 1 deletions(-)
> >
> > diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> > index cb4858b..8dd3e46 100644
> > --- a/drivers/mtd/mtdcore.c
> > +++ b/drivers/mtd/mtdcore.c
> > @@ -322,6 +322,12 @@ int add_mtd_device(struct mtd_info *mtd)
> > if (!mtd_table[i]) {
> > struct mtd_notifier *not;
> >
> > + err = bdi_register(mtd->backing_dev_info, NULL, "mtd%d",
> > + i);
> > + if (err) {
> > + /* We lose the errno information :( */
> > + break;
> > + }
>
> This is not a good idea, even if it'll currently work.
>
> > @@ -692,6 +698,15 @@ static int __init init_mtd(void)
> > int ret;
> > ret = class_register(&mtd_class);
> >
> > + ret = bdi_init(&mtd_bdi_unmappable);
> > + if (ret)
> > + return ret;
> > + ret = bdi_init(&mtd_bdi_ro_mappable);
> > + if (ret)
> > + return ret;
> > + ret = bdi_init(&mtd_bdi_rw_mappable);
> > + if (ret)
> > + return ret;
>
> Do the bdi_register() here as well.

-ENOBRAIN

Initially I wanted to do just than. Then I looked at the block layer
and thought we could create one backing_dev_info per mtd as well. Not
necessarily a bad if I would actually _create_ them and not just reuse
the same ones over and over again.

Jörn

--
Linux [...] existed just for discussion between people who wanted
to show off how geeky they were.
-- Rob Enderle
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Jens Axboe on
On Mon, Apr 26 2010, J�rn Engel wrote:
> On Mon, 26 April 2010 19:02:48 +0200, Jens Axboe wrote:
> > On Mon, Apr 26 2010, J�rn Engel wrote:
> > > Otherwise we hit a BUG_ON in bdi_queue_work().
> > >
> > > Signed-off-by: Joern Engel <joern(a)logfs.org>
> > > ---
> > > drivers/mtd/mtdcore.c | 17 ++++++++++++++++-
> > > 1 files changed, 16 insertions(+), 1 deletions(-)
> > >
> > > diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> > > index cb4858b..8dd3e46 100644
> > > --- a/drivers/mtd/mtdcore.c
> > > +++ b/drivers/mtd/mtdcore.c
> > > @@ -322,6 +322,12 @@ int add_mtd_device(struct mtd_info *mtd)
> > > if (!mtd_table[i]) {
> > > struct mtd_notifier *not;
> > >
> > > + err = bdi_register(mtd->backing_dev_info, NULL, "mtd%d",
> > > + i);
> > > + if (err) {
> > > + /* We lose the errno information :( */
> > > + break;
> > > + }
> >
> > This is not a good idea, even if it'll currently work.
> >
> > > @@ -692,6 +698,15 @@ static int __init init_mtd(void)
> > > int ret;
> > > ret = class_register(&mtd_class);
> > >
> > > + ret = bdi_init(&mtd_bdi_unmappable);
> > > + if (ret)
> > > + return ret;
> > > + ret = bdi_init(&mtd_bdi_ro_mappable);
> > > + if (ret)
> > > + return ret;
> > > + ret = bdi_init(&mtd_bdi_rw_mappable);
> > > + if (ret)
> > > + return ret;
> >
> > Do the bdi_register() here as well.
>
> -ENOBRAIN
>
> Initially I wanted to do just than. Then I looked at the block layer
> and thought we could create one backing_dev_info per mtd as well. Not
> necessarily a bad if I would actually _create_ them and not just reuse
> the same ones over and over again.

I cooked up that patch myself, here:

http://git.kernel.dk/?p=linux-2.6-block.git;a=commit;h=0661b1ac5d48eb47c8a5948c0554fea25e0895ab

Care to give it a quick spin?

--
Jens Axboe

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Paolo Minazzi on
I Jens,
I'm Paolo Minazzi and I have a problem with logfs and 2.6.34rc5.
Can I apply the patch to rc5 and make a test on my ARM board ?
Paolo



On Tue, Apr 27, 2010 at 9:52 AM, Jens Axboe <jens.axboe(a)oracle.com> wrote:
> On Mon, Apr 26 2010, J�rn Engel wrote:
>> On Mon, 26 April 2010 19:02:48 +0200, Jens Axboe wrote:
>> > On Mon, Apr 26 2010, J�rn Engel wrote:
>> > > Otherwise we hit a BUG_ON in bdi_queue_work().
>> > >
>> > > Signed-off-by: Joern Engel <joern(a)logfs.org>
>> > > ---
>> > > �drivers/mtd/mtdcore.c | � 17 ++++++++++++++++-
>> > > �1 files changed, 16 insertions(+), 1 deletions(-)
>> > >
>> > > diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
>> > > index cb4858b..8dd3e46 100644
>> > > --- a/drivers/mtd/mtdcore.c
>> > > +++ b/drivers/mtd/mtdcore.c
>> > > @@ -322,6 +322,12 @@ int add_mtd_device(struct mtd_info *mtd)
>> > > � � � � � if (!mtd_table[i]) {
>> > > � � � � � � � � � struct mtd_notifier *not;
>> > >
>> > > + � � � � � � � � err = bdi_register(mtd->backing_dev_info, NULL, "mtd%d",
>> > > + � � � � � � � � � � � � � � � � i);
>> > > + � � � � � � � � if (err) {
>> > > + � � � � � � � � � � � � /* We lose the errno information :( */
>> > > + � � � � � � � � � � � � break;
>> > > + � � � � � � � � }
>> >
>> > This is not a good idea, even if it'll currently work.
>> >
>> > > @@ -692,6 +698,15 @@ static int __init init_mtd(void)
>> > > � int ret;
>> > > � ret = class_register(&mtd_class);
>> > >
>> > > + ret = bdi_init(&mtd_bdi_unmappable);
>> > > + if (ret)
>> > > + � � � � return ret;
>> > > + ret = bdi_init(&mtd_bdi_ro_mappable);
>> > > + if (ret)
>> > > + � � � � return ret;
>> > > + ret = bdi_init(&mtd_bdi_rw_mappable);
>> > > + if (ret)
>> > > + � � � � return ret;
>> >
>> > Do the bdi_register() here as well.
>>
>> -ENOBRAIN
>>
>> Initially I wanted to do just than. �Then I looked at the block layer
>> and thought we could create one backing_dev_info per mtd as well. �Not
>> necessarily a bad if I would actually _create_ them and not just reuse
>> the same ones over and over again.
>
> I cooked up that patch myself, here:
>
> http://git.kernel.dk/?p=linux-2.6-block.git;a=commit;h=0661b1ac5d48eb47c8a5948c0554fea25e0895ab
>
> Care to give it a quick spin?
>
> --
> Jens Axboe
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Jens Axboe on
On Tue, Apr 27 2010, Paolo Minazzi wrote:
> I Jens,
> I'm Paolo Minazzi and I have a problem with logfs and 2.6.34rc5.
> Can I apply the patch to rc5 and make a test on my ARM board ?
> Paolo

Yes please do, below are the collected fixes for mtd in this area. It
should apply to recent -git just fine.

diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index 82d1e4d..4521b1e 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -4,7 +4,7 @@

# Core functionality.
obj-$(CONFIG_MTD) += mtd.o
-mtd-y := mtdcore.o mtdsuper.o mtdbdi.o
+mtd-y := mtdcore.o mtdsuper.o
mtd-$(CONFIG_MTD_PARTITIONS) += mtdpart.o

obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
diff --git a/drivers/mtd/internal.h b/drivers/mtd/internal.h
index c658fe7..e69de29 100644
--- a/drivers/mtd/internal.h
+++ b/drivers/mtd/internal.h
@@ -1,17 +0,0 @@
-/* Internal MTD definitions
- *
- * Copyright © 2006 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells(a)redhat.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-/*
- * mtdbdi.c
- */
-extern struct backing_dev_info mtd_bdi_unmappable;
-extern struct backing_dev_info mtd_bdi_ro_mappable;
-extern struct backing_dev_info mtd_bdi_rw_mappable;
diff --git a/drivers/mtd/mtdbdi.c b/drivers/mtd/mtdbdi.c
index 5ca5aed..e69de29 100644
--- a/drivers/mtd/mtdbdi.c
+++ b/drivers/mtd/mtdbdi.c
@@ -1,43 +0,0 @@
-/* MTD backing device capabilities
- *
- * Copyright © 2006 Red Hat, Inc. All Rights Reserved.
- * Written by David Howells (dhowells(a)redhat.com)
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/backing-dev.h>
-#include <linux/mtd/mtd.h>
-#include "internal.h"
-
-/*
- * backing device capabilities for non-mappable devices (such as NAND flash)
- * - permits private mappings, copies are taken of the data
- */
-struct backing_dev_info mtd_bdi_unmappable = {
- .capabilities = BDI_CAP_MAP_COPY,
-};
-
-/*
- * backing device capabilities for R/O mappable devices (such as ROM)
- * - permits private mappings, copies are taken of the data
- * - permits non-writable shared mappings
- */
-struct backing_dev_info mtd_bdi_ro_mappable = {
- .capabilities = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT |
- BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP),
-};
-
-/*
- * backing device capabilities for writable mappable devices (such as RAM)
- * - permits private mappings, copies are taken of the data
- * - permits non-writable shared mappings
- */
-struct backing_dev_info mtd_bdi_rw_mappable = {
- .capabilities = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT |
- BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP |
- BDI_CAP_WRITE_MAP),
-};
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 5b38b17..b177e75 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -2,6 +2,9 @@
* Core registration and callback routines for MTD
* drivers and users.
*
+ * bdi bits are:
+ * Copyright © 2006 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells(a)redhat.com)
*/

#include <linux/module.h>
@@ -16,11 +19,39 @@
#include <linux/init.h>
#include <linux/mtd/compatmac.h>
#include <linux/proc_fs.h>
+#include <linux/backing-dev.h>

#include <linux/mtd/mtd.h>
-#include "internal.h"

#include "mtdcore.h"
+/*
+ * backing device capabilities for non-mappable devices (such as NAND flash)
+ * - permits private mappings, copies are taken of the data
+ */
+struct backing_dev_info mtd_bdi_unmappable = {
+ .capabilities = BDI_CAP_MAP_COPY,
+};
+
+/*
+ * backing device capabilities for R/O mappable devices (such as ROM)
+ * - permits private mappings, copies are taken of the data
+ * - permits non-writable shared mappings
+ */
+struct backing_dev_info mtd_bdi_ro_mappable = {
+ .capabilities = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT |
+ BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP),
+};
+
+/*
+ * backing device capabilities for writable mappable devices (such as RAM)
+ * - permits private mappings, copies are taken of the data
+ * - permits non-writable shared mappings
+ */
+struct backing_dev_info mtd_bdi_rw_mappable = {
+ .capabilities = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT |
+ BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP |
+ BDI_CAP_WRITE_MAP),
+};

static int mtd_cls_suspend(struct device *dev, pm_message_t state);
static int mtd_cls_resume(struct device *dev);
@@ -628,20 +659,55 @@ done:
/*====================================================================*/
/* Init code */

+static int __init mtd_bdi_init(struct backing_dev_info *bdi, const char *name)
+{
+ int ret;
+
+ ret = bdi_init(bdi);
+ if (!ret)
+ ret = bdi_register(bdi, NULL, name);
+
+ if (ret)
+ bdi_destroy(bdi);
+
+ return ret;
+}
+
static int __init init_mtd(void)
{
int ret;
+
ret = class_register(&mtd_class);
+ if (ret)
+ goto err_reg;
+
+ ret = mtd_bdi_init(&mtd_bdi_unmappable, "mtd-unmap");
+ if (ret)
+ goto err_bdi1;
+
+ ret = mtd_bdi_init(&mtd_bdi_ro_mappable, "mtd-romap");
+ if (ret)
+ goto err_bdi2;
+
+ ret = mtd_bdi_init(&mtd_bdi_rw_mappable, "mtd-rwmap");
+ if (ret)
+ goto err_bdi3;

- if (ret) {
- pr_err("Error registering mtd class: %d\n", ret);
- return ret;
- }
#ifdef CONFIG_PROC_FS
if ((proc_mtd = create_proc_entry( "mtd", 0, NULL )))
proc_mtd->read_proc = mtd_read_proc;
#endif /* CONFIG_PROC_FS */
return 0;
+
+err_bdi3:
+ bdi_destroy(&mtd_bdi_ro_mappable);
+err_bdi2:
+ bdi_destroy(&mtd_bdi_unmappable);
+err_bdi1:
+ class_unregister(&mtd_class);
+err_reg:
+ pr_err("Error registering mtd class or bdi: %d\n", ret);
+ return ret;
}

static void __exit cleanup_mtd(void)
@@ -651,6 +717,9 @@ static void __exit cleanup_mtd(void)
remove_proc_entry( "mtd", NULL);
#endif /* CONFIG_PROC_FS */
class_unregister(&mtd_class);
+ bdi_destroy(&mtd_bdi_unmappable);
+ bdi_destroy(&mtd_bdi_ro_mappable);
+ bdi_destroy(&mtd_bdi_rw_mappable);
}

module_init(init_mtd);
diff --git a/drivers/mtd/mtdsuper.c b/drivers/mtd/mtdsuper.c
index af8b42e..7c00319 100644
--- a/drivers/mtd/mtdsuper.c
+++ b/drivers/mtd/mtdsuper.c
@@ -13,6 +13,7 @@
#include <linux/mtd/super.h>
#include <linux/namei.h>
#include <linux/ctype.h>
+#include <linux/slab.h>

/*
* compare superblocks to see if they're equivalent
@@ -44,6 +45,7 @@ static int get_sb_mtd_set(struct super_block *sb, void *_mtd)

sb->s_mtd = mtd;
sb->s_dev = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
+ sb->s_bdi = mtd->backing_dev_info;
return 0;
}



--
Jens Axboe

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/