Message ID | 1243604021.19886.152.camel@macbook.infradead.org |
---|---|
State | Accepted |
Commit | 81933046ef2a615031c46171013bde2c5225ee69 |
Headers | show |
On Fri, 29 May 2009 14:33:41 +0100, David Woodhouse <dwmw2@infradead.org> wrote: > > > This might work better. Nemoto-san, can you test and confirm? Sure, I will test it on next week. > > > diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c > > > > > if (plat->ch_mask != 1) { > > > + char *devname = dev_name(&dev->dev); > > > txx9_priv->cs = i; > > > + txx9_priv->mtdname = kmalloc(strlen(devname) + 3, > > > + GFP_KERNEL); > > > > kasprintf() might be nicer here? > > True; thanks. (Er, how have I managed not to know that asprintf() > exists, for the last 20-odd years?) > > diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c ... > } else { > txx9_priv->cs = -1; > - strcpy(txx9_priv->mtdname, dev_name(&dev->dev)); > + txx9_priv->mtdname = dev_name(&dev->dev); Use kstrdup() here, otherwise nand_scan() failure will cause memory leak. Or you can add conditional kfree into failure path of nand_scan(), but I think saving few bytes is not worth to complicate an error (and removal) path. > } > if (plat->wide_mask & (1 << i)) > chip->options |= NAND_BUSWIDTH_16; > @@ -385,6 +391,8 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev) > kfree(drvdata->parts[i]); > #endif > del_mtd_device(mtd); > + if (txx9_priv->mtdname != dev_name(&dev->dev)) > + kfree(txx9_priv->mtdname); If you did kstrdup() as above, you can just call kfree unconditionally. --- Atsushi Nemoto
diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c index 8124792..5f919e6 100644 --- a/drivers/mtd/nand/txx9ndfmc.c +++ b/drivers/mtd/nand/txx9ndfmc.c @@ -64,7 +64,7 @@ struct txx9ndfmc_priv { struct nand_chip chip; struct mtd_info mtd; int cs; - char mtdname[BUS_ID_SIZE + 2]; + const char *mtdname; }; #define MAX_TXX9NDFMC_DEV 4 @@ -334,11 +334,17 @@ static int __init txx9ndfmc_probe(struct platform_device *dev) if (plat->ch_mask != 1) { txx9_priv->cs = i; - sprintf(txx9_priv->mtdname, "%s.%u", - dev_name(&dev->dev), i); + txx9_priv->mtdname = kasprintf(GFP_KERNEL, "%s.%u", + dev_name(&dev->dev), i); + if (!txx9_priv->mtdname) { + kfree(txx9_priv); + dev_err(&dev->dev, + "Unable to allocate TXx9 NDFMC MTD device name.\n"); + continue; + } } else { txx9_priv->cs = -1; - strcpy(txx9_priv->mtdname, dev_name(&dev->dev)); + txx9_priv->mtdname = dev_name(&dev->dev); } if (plat->wide_mask & (1 << i)) chip->options |= NAND_BUSWIDTH_16; @@ -385,6 +391,8 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev) kfree(drvdata->parts[i]); #endif del_mtd_device(mtd); + if (txx9_priv->mtdname != dev_name(&dev->dev)) + kfree(txx9_priv->mtdname); kfree(txx9_priv); } return 0;