Why is PEB not erased before writing???
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
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
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,
io_write_data <------ here if I am
over-writing the sub-block(NOT 0xFF),
block,get a free PEB,write this block without
sub-block and write new sub-block
So whose job is to check block is not empty,so erase it then write it.
More information about the linux-mtd