1. A method of storing data comprising: receiving a request from a client to store data on a first storage device; determining if defined criteria are met; storing a most recent version of the data, if the defined criteria are met, on a second storage device and not on the first storage device by sending a write request to the second storage device, the second storage device comprising a circular log; maintaining an identity of the second storage device amongst a set of identified storage devices in a hard state data structure; maintaining logical block numbers for circular log blocks storing the data and a version number of the most recent version of the data in a soft state redirect data structure; and maintaining locations of older versions of the data in the circular log in a soft state garbage data structure until the older versions are invalidated.