Consider a simple key-value map, where "$hash $n" is the key and the value is the block of data. Only three operations need occur:
* if hash exists (highly unlikely!), read and compare w/ raw data
* write new block to disk
* add single datum to key-value index
Nicely described, but each block now needs a reference count
which is incrmented if the raw compare yields a positive and
decremented when a reference to it receives a write.
It may help to also have a reverse reference somewhere
from the block to the hash.
Inode block lists would need to be updated regardless of any collision; that would be a standard and required part of any VFS interaction. And
Under current schemes if i overwrite an already allocated
block of a file the block list need not be updated unless
the block is relocated. But that is a nit.