A method (600, 700) for providing backup data to restore a corrupted primary system to a state corresponding to a particular backup snapshot, wherein the method (600, 700) is performed by a secondary storage system, wherein the secondary storage system stores a plurality of backup snapshots of a primary system and wherein each backup snapshot of the plurality of backup snapshots comprises one or more data blocks, the method (600, 700) comprising: receiving, from the primary system, a request for one or more data blocks associated with the particular backup snapshot of the plurality of backup snapshots and that are not stored on the primary system to be provided to the primary system, the particular backup snapshot being a snapshot taken at a particular time that is earlier than a last backup snapshot, and wherein the particular backup snapshot corresponds to a first snapshot tree; receiving, from a change block tracker of the primary system, a map of one or more data blocks that have changed in the primary system since the last backup snapshot was stored on the secondary storage system, wherein the last backup snapshot corresponds to a second snapshot tree, and wherein the map identifies the one or more data blocks that have changed in the primary system since the last backup snapshot; traversing the second snapshot tree to identify a location of data bricks, in the second snapshot tree, corresponding to the one or more data blocks that have changed since the last backup snapshot and that are identified in the map; traversing (610, 704, 708) the first snapshot tree and traversing the second snapshot tree to determine one or more data blocks, of the particular backup snapshot, that have changed between the particular backup snapshot and the last backup snapshot; determining whether a conflict exists between the one or more data blocks that have changed since the last backup snapshot and the one or more data blocks that have changed between the particular backup snapshot and the last backup snapshot, wherein a conflict exists when a data brick, which comprises one or more data blocks, has changed between the particular backup snapshot and the last backup snapshot, and the one or more data blocks that correspond to the data brick have changed since the last backup snapshot; and providing, to the primary system, the one or more data blocks of the particular backup snapshot that are not stored on the primary system from the one or more data blocks that have changed since the last backup snapshot and/or from the one or more data blocks that have changed between the particular backup snapshot and the last backup snapshot, including resolving the conflict at least in part by providing, as part of the one or more data blocks of the particular backup snapshot that are not stored on the primary system, the one or more data blocks of the data brick that changed between the particular backup snapshot and the last backup snapshot and not providing the one or more data blocks of the data brick that changed since the last backup snapshot. receiving, from the primary system, a request for one or more data blocks associated with the particular backup snapshot of the plurality of backup snapshots and that are not stored on the primary system to be provided to the primary system, the particular backup snapshot being a snapshot taken at a particular time that is earlier than a last backup snapshot, and wherein the particular backup snapshot corresponds to a first snapshot tree; receiving, from a change block tracker of the primary system, a map of one or more data blocks that have changed in the primary system since the last backup snapshot was stored on the secondary storage system, wherein the last backup snapshot corresponds to a second snapshot tree, and wherein the map identifies the one or more data blocks that have changed in the primary system since the last backup snapshot; traversing the second snapshot tree to identify a location of data bricks, in the second snapshot tree, corresponding to the one or more data blocks that have changed since the last backup snapshot and that are identified in the map; traversing (610, 704, 708) the first snapshot tree and traversing the second snapshot tree to determine one or more data blocks, of the particular backup snapshot, that have changed between the particular backup snapshot and the last backup snapshot; determining whether a conflict exists between the one or more data blocks that have changed since the last backup snapshot and the one or more data blocks that have changed between the particular backup snapshot and the last backup snapshot, wherein a conflict exists when a data brick, which comprises one or more data blocks, has changed between the particular backup snapshot and the last backup snapshot, and the one or more data blocks that correspond to the data brick have changed since the last backup snapshot; and providing, to the primary system, the one or more data blocks of the particular backup snapshot that are not stored on the primary system from the one or more data blocks that have changed since the last backup snapshot and/or from the one or more data blocks that have changed between the particular backup snapshot and the last backup snapshot, including resolving the conflict at least in part by providing, as part of the one or more data blocks of the particular backup snapshot that are not stored on the primary system, the one or more data blocks of the data brick that changed between the particular backup snapshot and the last backup snapshot and not providing the one or more data blocks of the data brick that changed since the last backup snapshot.