1. A method of taking a snapshot of data comprising: obtaining a first map data structure that records locations for a plurality of data blocks; forming a second map data structure that is initially empty of locations, the second map data structure representing the snapshot after the snapshot is started; and applying a write on data to the first map if the write arrives before the snapshot is started, and otherwise to the second map if the write arrives after the snapshot is started.