[PATCH] fix for mtd partitions for erase_size != 2^X

Peter Menzebach pm-mtd at mw-itcon.de
Fri Sep 30 07:23:44 EDT 2005


Jörn Engel wrote:
> On Fri, 23 September 2005 20:02:42 +0200, Peter Menzebach wrote:
> 
>>Here a trivial patch,
>>which allows correct creation of mtd partitions, which have erase sizes
>>which are not a power of 2.
>>
>>Best regards
>>Peter
>>
>>Sorry, I didn't succeed to get the patch accepted by the mailing list as
>>attachment.
> 
> 
> I actually prefer inline.  Except that your mailer seems to have
> messed things up - grr.
> 
> 
>>--- drivers/mtd/mtdpart.c.orig    2005-09-23 09:28:07.000000000 +0200
>>+++ drivers/mtd/mtdpart.c    2005-09-23 09:29:37.000000000 +0200
>>@@ -465,9 +465,9 @@
>>         if (slave->offset == MTDPART_OFS_APPEND)
>>             slave->offset = cur_offset;
>>         if (slave->offset == MTDPART_OFS_NXTBLK) {
>>-            u_int32_t emask = master->erasesize-1;
>>-            slave->offset = (cur_offset + emask) & ~emask;
>>-            if (slave->offset != cur_offset) {
>>+            slave->offset = cur_offset;
>>+            if ((cur_offset % master->erasesize) != 0) {
>>+                slave->offset = ((cur_offset / master->erasesize) + 1) 
>>* master->erasesize;
>>                 printk(KERN_NOTICE "Moving partition %d: "
>>                        "0x%08x -> 0x%08x\n", i,
>>                        cur_offset, slave->offset);
> 
> 
> Looks complicated.  I guess we could use the equivalent of this:
> #define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
> in some header.  Then your patch would be as simple as
> 
>          if (slave->offset == MTDPART_OFS_APPEND)
>              slave->offset = cur_offset;
>          if (slave->offset == MTDPART_OFS_NXTBLK) {
> -            u_int32_t emask = master->erasesize-1;
> -            slave->offset = (cur_offset + emask) & ~emask;
> +	     slave->offset = TRUE_ALIGN(cur_offset, master->erasesize);
>              if (slave->offset != cur_offset) {
>                  printk(KERN_NOTICE "Moving partition %d: "
>                         "0x%08x -> 0x%08x\n", i,
> 
> Maybe this:
> #define TRUE_ALIGN(x,a) (((x)+(a)-1) - ((x)+(a)-1) % a)
> 
> The macro is still complicated, but we just have to get it right once.
> 
> Jörn
> 
Here the patch again. As the macro does not seem to reduce the 
complexity of the line seriously and would be used only once, I did put 
in a comment, which explains inline, what should go on there.

The patch now as link:
http://www.mw-itcon.de/patches/patch.dataflash.mtdpart.c

Best regards
Peter


-- 
Peter Menzebach
Menzebach und Wolff IT-Consulting GbR
Phone +49 751 355 387 1




More information about the linux-mtd mailing list