A system and method for remote asynchronous replication or mirroring of
changes in a source file system snapshot in a destination replica file
system using a scan (via a scanner) of the blocks that make up two
versions of a snapshot of the source file system, which identifies
changed blocks in the respective snapshot files based upon differences in
volume block numbers identified in a scan of the logical file block index
of each snapshot. Trees of blocks associated with the files are
traversed, bypassing unchanged pointers between versions and walking down
to identify the changes in the hierarchy of the tree. These changes are
transmitted to the destination mirror or replicated snapshot. This
technique allows regular files, directories, inodes and any other
hierarchical structure to be efficiently scanned to determine differences
between versions thereof. The changes in the files and directories are
transmitted over the network for update of the replicated destination
snapshot in an asynchronous (lazy write) manner. The changes are
described in an extensible, system-independent data stream format layered
under a network transport protocol. At the destination, source changes
are used to update the destination snapshot. Any deleted or modified
inodes already on the destination are moved to a temporary or "purgatory"
directory and, if reused, are relinked to the rebuilt replicated snapshot
directory. The source file system snapshots can be representative of a
volume sub-organization, such as a qtree.