]> err.no Git - linux-2.6/commitdiff
[MTD] Fix module refcounting in NAND board drivers.
authorDavid Woodhouse <dwmw2@infradead.org>
Sun, 14 May 2006 00:20:46 +0000 (01:20 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Sun, 14 May 2006 00:20:46 +0000 (01:20 +0100)
The _board_ driver needs to be mtd->owner, and it in turn pins the
nand.ko module. Fix them all to actually do that, and fix nand.ko not to
overwrite it -- and also to check that the caller sets it, if the caller
is a module.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
14 files changed:
drivers/mtd/nand/au1550nd.c
drivers/mtd/nand/autcpu12.c
drivers/mtd/nand/cs553x_nand.c
drivers/mtd/nand/edb7312.c
drivers/mtd/nand/h1910.c
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/nandsim.c
drivers/mtd/nand/ppchameleonevb.c
drivers/mtd/nand/rtc_from4.c
drivers/mtd/nand/s3c2410.c
drivers/mtd/nand/sharpsl.c
drivers/mtd/nand/spia.c
drivers/mtd/nand/toto.c
drivers/mtd/nand/ts7250.c

index 50cbfd4826fbc5b6fac0277fc0f072a689b7ec65..87d34351a86d3e6eb743153f0c05922afca8976c 100644 (file)
@@ -345,6 +345,7 @@ int __init au1xxx_nand_init(void)
 
        /* Link the private data with the MTD structure */
        au1550_mtd->priv = this;
+       au1550_mtd->owner = THIS_MODULE;
 
        /* disable interrupts */
        au_writel(au_readl(MEM_STNDCTL) & ~(1 << 8), MEM_STNDCTL);
index 9c9f21b0d260b3f1b69c517a58fb56b4c2976bcd..330deb03221728c1c7e08383efd6185a098f452f 100644 (file)
@@ -154,6 +154,7 @@ int __init autcpu12_init(void)
 
        /* Link the private data with the MTD structure */
        autcpu12_mtd->priv = this;
+       autcpu12_mtd->owner = THIS_MODULE;
 
        /* Set address of NAND IO lines */
        this->IO_ADDR_R = autcpu12_fio_base;
index fba7be5cffe339b48c12a0c50c0725c88a0fbe64..d5b05514bb8b6ba934f993d0f9afd7f2a8866c92 100644 (file)
@@ -223,6 +223,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
 
        /* Link the private data with the MTD structure */
        new_mtd->priv = this;
+       new_mtd->owner = THIS_MODULE;
 
        /* map physical address */
        this->IO_ADDR_R = this->IO_ADDR_W = ioremap(adr, 4096);
@@ -255,7 +256,6 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr)
                goto out_ior;
        }
 
-       new_mtd->owner = THIS_MODULE;
        cs553x_mtd[cs] = new_mtd;
        goto out;
 
index 8467d770710c1e1130ad4c1e07f3e7fc604ab827..ad4488abfb0b2aed3fae1df292414901aab3c11a 100644 (file)
@@ -148,6 +148,7 @@ static int __init ep7312_init(void)
 
        /* Link the private data with the MTD structure */
        ep7312_mtd->priv = this;
+       ep7312_mtd->owner = THIS_MODULE;
 
        /*
         * Set GPIO Port B control register so that the pins are configured
index efa53a9adf233bade29fcdcf9497bcefe6561f81..b47a15c23d1c5a33ea1d18b4e4065245a6f7b79c 100644 (file)
@@ -135,6 +135,7 @@ static int __init h1910_init(void)
 
        /* Link the private data with the MTD structure */
        h1910_nand_mtd->priv = this;
+       h1910_nand_mtd->owner = THIS_MODULE;
 
        /*
         * Enable VPEN
index fdaf32083ada3eb53fac0e0f9e43c9ff26d06d54..42cff0a2b93d2d7bd8f690a2a4b44ed2033f8729 100644 (file)
@@ -69,6 +69,7 @@
  *
  */
 
+#include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/sched.h>
@@ -2316,11 +2317,12 @@ static void nand_resume(struct mtd_info *mtd)
  * @mtd:       MTD device structure
  * @maxchips:  Number of chips to scan for
  *
- * This fills out all the not initialized function pointers
+ * This fills out all the uninitialized function pointers
  * with the defaults.
  * The flash ID is read and the mtd/chip structures are
  * filled with the appropriate values. Buffers are allocated if
  * they are not provided by the board driver
+ * The mtd->owner field must be set to the module of the caller
  *
  */
 int nand_scan(struct mtd_info *mtd, int maxchips)
@@ -2328,6 +2330,16 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
        int i, nand_maf_id, nand_dev_id, busw, maf_id;
        struct nand_chip *this = mtd->priv;
 
+       /* module_text_address() isn't exported. But if _this_ is a module,
+          it's a fairly safe bet that its caller is a module too... and
+          that means the call to module_text_address() gets optimised out
+          without having to resort to ifdefs */
+       if (!mtd->owner && (THIS_MODULE ||
+           module_text_address((unsigned long)__builtin_return_address(0)))) {
+               printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
+               BUG();
+       }
+
        /* Get buswidth to select the correct functions */
        busw = this->options & NAND_BUSWIDTH_16;
 
@@ -2676,8 +2688,6 @@ int nand_scan(struct mtd_info *mtd, int maxchips)
        /* and make the autooob the default one */
        memcpy(&mtd->oobinfo, this->autooob, sizeof(mtd->oobinfo));
 
-       mtd->owner = THIS_MODULE;
-
        /* Check, if we should skip the bad block table scan */
        if (this->options & NAND_SKIP_BBTSCAN)
                return 0;
index a0af92cc7efd787624f6848d93d618eca898ce84..6903f5b903c6878423e5612d9d68c0d93975a102 100644 (file)
@@ -1546,6 +1546,8 @@ static int __init ns_init_module(void)
                chip->options |= NAND_BUSWIDTH_16;
        }
 
+       nsmtd->owner = THIS_MODULE;
+
        if ((retval = nand_scan(nsmtd, 1)) != 0) {
                NS_ERR("can't register NAND Simulator\n");
                if (retval > 0)
index 405beece9c5a98a7f0f678b6a7a9289f35463902..5d4d16fb1df63849b592b0b4443e5b3f731503f2 100644 (file)
@@ -221,6 +221,7 @@ static int __init ppchameleonevb_init(void)
 
        /* Link the private data with the MTD structure */
        ppchameleon_mtd->priv = this;
+       ppchameleon_mtd->owner = THIS_MODULE;
 
        /* Initialize GPIOs */
        /* Pin mapping for NAND chip */
index 1887989fb885d18aa121172fef67fed7b8097beb..0c56a6629128ba2298d8472d8bce54a965582863 100644 (file)
@@ -538,6 +538,7 @@ int __init rtc_from4_init(void)
 
        /* Link the private data with the MTD structure */
        rtc_from4_mtd->priv = this;
+       rtc_from4_mtd->owner = THIS_MODULE;
 
        /* set area 5 as PCMCIA mode to clear the spec of tDH(Data hold time;9ns min) */
        bcr1 = *SH77X9_BCR1 & ~0x0002;
index 338fda87b9e52cf0ca364b47c4872071cd945bf3..f8002596de8bcb62e8edcefb9ee6179dabdd9aef 100644 (file)
@@ -516,6 +516,7 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
 
        nmtd->info         = info;
        nmtd->mtd.priv     = chip;
+       nmtd->mtd.owner    = THIS_MODULE;
        nmtd->set          = set;
 
        if (hardware_ecc) {
index 25322a8d44d85f7e59e8d7eb48c607d8076482be..d375cb3e77d699e1481f0e1057c1e56d2cae222f 100644 (file)
@@ -185,6 +185,7 @@ int __init sharpsl_nand_init(void)
 
        /* Link the private data with the MTD structure */
        sharpsl_mtd->priv = this;
+       sharpsl_mtd->owner = THIS_MODULE;
 
        /*
         * PXA initialize
index a11354b9afa2dadcfe8b451c7c710e9e319b5f4e..b06aada31f79a41b6957d56d3679487231a39ad9 100644 (file)
@@ -121,6 +121,7 @@ int __init spia_init(void)
 
        /* Link the private data with the MTD structure */
        spia_mtd->priv = this;
+       spia_mtd->owner = THIS_MODULE;
 
        /*
         * Set GPIO Port E control register so that the pins are configured
index e3a90e60e2496e5d1c85cfde81ee983aa3f0aff1..24cfa9e2e025febe344063b6077d4a14c0a66e6b 100644 (file)
@@ -137,6 +137,7 @@ int __init toto_init(void)
 
        /* Link the private data with the MTD structure */
        toto_mtd->priv = this;
+       toto_mtd->owner = THIS_MODULE;
 
        /* Set address of NAND IO lines */
        this->IO_ADDR_R = toto_io_base;
index d2b7d57ace42c37b5b13b470b248eac33505a8cf..756ef64b0efdd4eec5655abf1a3d50d2cab42633 100644 (file)
@@ -147,6 +147,7 @@ static int __init ts7250_init(void)
 
        /* Link the private data with the MTD structure */
        ts7250_mtd->priv = this;
+       ts7250_mtd->owner = THIS_MODULE;
 
        /* insert callbacks */
        this->IO_ADDR_R = (void *)TS72XX_NAND_DATA_VIRT_BASE;