On Monday 25 July 2005 19:51, Martin Egholm Nielsen wrote: > Hi again, > > I know I'm making a lot of noise, but has the below fix been implemented > in YAFFS' HEAD? This is not yet fixed. I hope to do something about this during this week. I have though about it more and the "shadowing" method is still the best, IMHO. > > // 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.