[PATCH 1/2] mtdpart: memory accessor interface for MTD layer

Sudhakar Rajashekhara sudhakar.raj at ti.com
Mon Aug 9 07:55:13 EDT 2010


Hi David,

On Sun, Aug 08, 2010 at 17:53:18, David Woodhouse wrote:
> 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 at 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
>   */
> 
> -- 

Thanks very much for this piece of code, it reduced my work. But while working
on this, I found out that, for m25p80 device, the MTD device is available even
for the add_mtd_partitions() case. So the method to read the MAC address remains
same both for un-partitioned and partitioned MTD device. I'll post the modified
patch tomorrow. I'll be looking forward to hearing your comments on that patch
as well.

Thanks,
Sudhakar 





More information about the linux-mtd mailing list