Hi again,
I know I'm making a lot of noise, but has the below fix been implemented
in YAFFS' HEAD?
// Martin
> I have investigated this and figured out a fix which I will code and test in
> the next few days.
>
> I considered a few approaches, but the mechanism I have settled on uses a
> "shadowing" field.
>
> The code went like this:
>
> if (newname exists)
> {
> unlink(newname);
> }
> rename(oldname,newname)
>
> The problem Sergei discovered was that the power could be lost between the
> unlink and the rename, causing the file system to end up with no file called
> newname.
>
> We cannot just reverse the order because that could leave us with two names
> for different files -- bad!
>
> The new code will go like this
>
> if (newname exists)
> {
> rename_with_shadow(oldname,newname);
> // Point A
> unlink(newname);
> // Point B
> }
> rename(oldname,newname)
>
> A shadowing rename is like its non-shadowing brother except that it also
> stores the object Id of the object that it "shadows". The semantics of
> scanning a shadowing objectheader are different. If the shadowed object
> exists (ie power lost at point A) then we unlink it.
>
> Essentially the shadowing gives us a way of determining priority between two
> like-named objects.
>
> Why do we rename without the shadow afterwards? This is done so that we
> remove the shadow after it is no longer needed. If this was not done we would
> potentially have a shadow hanging around that would cause future files with
> the same object Id to get deleted.