A primary processor manages metadata of a production dataset and a
snapshot copy, while a secondary processor provides concurrent read-write
access to the primary dataset. The secondary processor determines when a
first write is being made to a data block of the production dataset, and
in this case sends a metadata change request to the primary data
processor. The primary data processor commits the metadata change to the
production dataset and maintains the snapshot copy while the secondary
data processor continues to service other read-write requests. The
secondary processor logs metadata changes so that the secondary processor
may return a "write completed" message before the primary processor
commits the metadata change. The primary data processor pre-allocates
data storage blocks in such a way that the "write anywhere" method does
not result in a gradual degradation in I/O performance.