Why is PEB not erased before writing???

Brijesh Singh brijesh.s.singh at gmail.com
Tue Feb 20 06:08:24 EST 2007


On 2/20/07, Thomas Gleixner <tglx at linutronix.de> wrote:
> On Tue, 2007-02-20 at 15:19 +0530, brijesh.singh at calsoftinc.com wrote:
> > > Applications and UBI kernel users have no access to physical erase
> > > blocks. They look at logical erase blocks. UBI manages the translation
> > > of logical to physical blocks. If you write to the same logical erase
> > > block again UBI will just write to a different physical erase block and
> > > erase the previous PEB later on. The internal management guarantees that
> > > the application looks only at the newest written block and not at the
> > > older one.
> >
> > Yes this is what I thought it should do.If LEB is mapped to a dirty PEB
> > remap it and wl daemon will erase it.But it doesn't.
> > But here is the scenario
> > Steps
> >      *I made a 2MB ubi volume
> >      *Total mtd device size is 3MB
> >      *I wrote a 2MB file to UBI using "dd if=file of=/dev/ubi_vol"
> >      *Now device is full
> >      *Again I did the same thing.
> >      *Now theoretically erase should have been called,by wl or eba module
> >      *But it directly over-writes the device.
> > I am using mtdram to test if erase is called.Nop,it is not.
> > Cdev write interface calls eba_write which doesn't check if block is
> > already written.And it over-writes it with no call to erase.
> > Now what to do?Erase is not even called!
>
> Did you enable CONFIG_MTD_USERSPACE_IO ? If yes, then the behaviour is
> clear. This is a _DEBUG_ option and bypasses the normal update
> procedure.
>
>         tglx
>
>
>

Yes I did enable this CONFIG_MTD_UBI_USERSPACE_IO  option.We can't
write the device if this flag is not enabled.UBI treats the device as
readonly.
This  is the usual way to write UBI device,I guess.

UBI doesn't maintain which write sub-block is dirty.Most of the
hardwares don't give error if user is "not writing free sub-block".
There is a paranoid check in ubi_io_write_data to check all 0xFF but
not a mainline check

The call hirerchy of write is,
cdev- write
eba-write
     if mapped
                io_write_data               <------ here if I am
over-writing the sub-block(NOT 0xFF),
                                                            UBI should
                                                            copy
block,get a free PEB,write this block without
     else                                                  old
sub-block and write new sub-block
               map LEB-PEB
               io_write_data
io-write
   call mtd-write

So whose job is to check block is not empty,so erase it then write it.




More information about the linux-mtd mailing list