Flash disks and FFS layout heuristics
Matthew Dillon
dillon at apollo.backplane.com
Mon Mar 31 12:27:08 PDT 2008
This is all very good information. I was unaware of the adjacent write
effect, but it makes sense considering the cell size. Hard drives have
a similar effect (it's one of the limiting factors for density).
Hamming codes (ECC codes) are very fragile beasts. While they are in the
same family as a CRC it is a really bad idea to try to use the ECC code
as your CRC which is why I recommended against it in my previous posting.
A two-bit-detect/one-bit-correction code is utterly trivial to generate
(both generating it and using it)... I've done such codes in 8-bit cpu's.
Their fragility can be surprising to anyone who has never worked with
them.
I've written numerous filesystems, including a NOR flash filesystem
(whos characteristics are somewhat different due to the availability of
byte-write). In my opinion, designing a filesystem *specifically* for
NAND flash is a mistake because the technology is rapidly evolving and
such a filesystem would wind up being obsolete in fairly short order.
For example, the simple addition of some front-end non-volatile cache,
such as a dime-cap-backed static ram, would have a very serious effect
on any such filesystem design. It is far far better to design the
filesystem around generally desired characteristics, such as good
write locality of reference (though, again, indices still have to be
updated and those usually do not have good locality of reference).
DragonFly's HAMMER has pretty good write-locality of reference but still
does random updates for B-Tree indices and things like the mtime and
atime fields. It also uses numerous blockmaps that could make direct use
of a flash sector-mapping translation layer (1). It might be adaptable.
(1) A flash sector-mapping translation layer gives a filesystem the
ability to use 'named block numbers'. For example, the NOR filesystem
I did used 32 bit named block numbers regardless of the size of the
flash (which was typically only 2MB). The filesystem topology was
actually encoded into the block number it self. In other words, the
filesystem is not bound to a linear range of block numbers it is
simply bound
What does this mean? This means that what you really want to do is not
necessarily write a filesystem that is explicitly designed for NAND
operation, but instead write a filesystem that is explicitly designed
to run on top of an abstracted topology (such as one where you can have
named block numbers), and which generally has the desired features for
locality of reference. Such a filesystem would not become obsolete
anywhere near as quickly as a nand-specific filesystem would and
rebuilding an abstracted topology (whos underlying code would become
obsolete as the technology changes) is a whole lot easier then
redesigning a filesystem.
I am quite partial to the named-block concept, I really think it's the
best way to go for flash filesystem design. The flash already has to
have a sector-translation mechanism, making the jump to a full blown
named-block model is only a small additional step.
-Matt
More information about the freebsd-arch
mailing list