Prev: [PATCH v3] firewire: cdev: check write quadlet request length to avoid buffer overflow
Next: [PATCH V4 0/5] Add MMC erase and secure erase V4
From: David Brownell on 4 Aug 2010 07:30 --- On Wed, 8/4/10, David Woodhouse <dwmw2(a)infradead.org> wrote: > > Point is to ensure that enough of the right context > > information is available to initialize correctly. > > So the right data is extracted and passed on. And also, ISTR, that the mechanism is general enough to work with both MTD and EEPROM ... > > Forgive me if I'm being dim (and in particular, please > forgive me if I'm > going over something that was already discussed; I know > it's been a > while). I also am at risk of getting lost in a pile of hypotheticals which have been left behind earlier in these threads. But I don't see why it needs to be passed through > the core MTD code. > > To take the simple case of an unpartitioned MTD device -- > why can't the > map driver (or whatever) just call the maccessor setup > function for > itself, directly, right after calling add_mtd_device() with > its newly-probed MTD device? No idea, except that doing it once rather than modifying every driver would seem healthier. Surely changing all drivers is a Bad Thing. > > And for partitions, why can't it do the same, on the > appropriate partition. > > OK, the answer to the latter question is that you don't > actually *have* > the pointers to each partition you register. But that's > easily fixed. > > If we make add_mtd_partitions() take an extra 'struct > mtd_info **' > argument and put pointers to the slave mtd 'devices' into > that, it means > that your board driver *can* reliably get the mtd pointer > for the fourth > partition, or whatever it needs. And can then just do the > memory > accessor setup for itself. > > Isn't that enough? Might be. Not my patch though... You asked why the context was needed along with the partition data (otherwise not available); I answered. Still haven't seen a better patch though. -- 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: David Woodhouse on 8 Aug 2010 08:30
On Fri, 2010-08-06 at 12:18 +0530, Sudhakar Rajashekhara wrote: > > Thanks for the feedback. I'll be re-working on this patch and will > re-post > the updated patch soon. Start with this, perhaps... Subject: mtd/partitions: Add add_mtd_partitions_ret() function Some callers want access to the MTD devices which get registered for them when they call add_mtd_partitions(). Add a variant on the function which does that. Signed-off-by: David Woodhouse <David.Woodhouse(a)intel.com> diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 4c539de..b9ee79b 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c @@ -522,26 +522,36 @@ out_register: * for reasons of data integrity. */ -int add_mtd_partitions(struct mtd_info *master, - const struct mtd_partition *parts, - int nbparts) +int add_mtd_partitions_ret(struct mtd_info *master, + const struct mtd_partition *parts, + int nbparts, struct mtd_info ***mtds_ret) { struct mtd_part *slave; uint64_t cur_offset = 0; + struct mtd_info **mtds = NULL; int i; printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name); + if (mtds_ret) { + mtds = kmalloc(sizeof(*mtds) * nbparts, GFP_KERNEL); + if (!mtds) + return -ENOMEM; + } for (i = 0; i < nbparts; i++) { slave = add_one_partition(master, parts + i, i, cur_offset); - if (!slave) + if (!slave) { + kfree(mtds); return -ENOMEM; + } cur_offset = slave->offset + slave->mtd.size; } + if (mtds_ret) + *mtds_ret = mtds; return 0; } -EXPORT_SYMBOL(add_mtd_partitions); +EXPORT_SYMBOL_GPL(add_mtd_partitions_ret); static DEFINE_SPINLOCK(part_parser_lock); static LIST_HEAD(part_parsers); diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index 274b619..f7935fa 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h @@ -49,9 +49,12 @@ struct mtd_partition { struct mtd_info; -int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); +int add_mtd_partitions_ret(struct mtd_info *, const struct mtd_partition *, int, + struct mtd_info ***); int del_mtd_partitions(struct mtd_info *); +#define add_mtd_partitions(m, p, n) add_mtd_partitions_ret(m, p, n, NULL) + /* * Functions dealing with the various ways of partitioning the space */ -- David Woodhouse Open Source Technology Centre David.Woodhouse(a)intel.com Intel Corporation -- 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/ |