The new INodeReference looks pretty good. My thoughts about the current patch:
1. While deleting snapshots, we may have to handle INodeReference. Using the same example in the javadoc of INodeReference: in /abc, if ref(1001, foo) is in the deleted list of the very first diff, when we want to delete the correspond diff, the current code may destroy the inode bar(1000) even if it is still referred by others? Simiarly scenarios if ref(1001, foo) is processed by a Processor. We may need to check the reference number first and decide if we need to destroy the referred INode (i.e., bar(1000)).
2. After the reference number is decrease to 0, we need to destroy the inode (bar(1000)) and delete the reference node (ref(1003)).
3. In both unprotectedRename methods, seems that srcParent.asDirectory.replaceChild4Reference only replaces the current child and the created list, and we need to replace the inode in the deleted list?
Minor:
4. INodeReference.java, INodeReference#referenced can be renamed to INodeReference#referred or some other name? Similarly update the javadoc of the class.
5. In javadoc of INodeReference, /abc will have a child ref(1001, foo) instead of ref(1001), /xyz will have a child ref(1002) instead of ref(1002, bar)?
6. In INodeDirectory#replaceChild, can oldChild.getParentReference() return a non-null result?
7. WithName#setLocalName will not be called in normal cases?
h4534_20130307.patch: add INodeReference to support rename. The patch is not yet completed.