A computer assisted method of organizing a data structure for managing a computer storage device that contains a plurality of blocks, wherein an origin volume and snapshot stores use the storage device to store origin volume data and snapshot store data, and wherein when a snapshot is first created, it is identical to the origin volume, the method comprising the following sequence of steps: (a) initializing entries of the data structure to indicate that the blocks are shared between the origin volume and one or more snapshot stores, wherein: each entry is associated with a chunk that includes multiple blocks and represents a granularity of snapshot copy-outs the data structure is implemented using a btree structure including a set of index nodes and leaf nodes, the leaf nodes including a header, a table of exceptions and a directory map; for each chunk, a list of exceptions is stored which includes a snapshot address and a bitmap specifying which snapshots share that exception; and exceptions for all snapshots are stored in the btree indexed by logical chunk address such that a logical chunk is shared unless all active snapshots have exceptions for that chunk; (b) receiving a request to modify a first portion of the origin volume; (c) identifying a first chunk that contains the first portion to be modified; and (d) consulting the btree to determine whether or not all snapshots have exceptions for the first chunk and thus whether the first chunk is shared or unshared; and if it is determined in step (d) that the first chunk is shared: writing first metadata into an entry of the data structure to indicate that the first chunk is unshared, wherein writing the first metadata comprises associating the first chunk with one of the leaf nodes in the btree structure and creating an exception for the associated leaf node for the chunk to indicate that the chunk in unshared; copying data of the first chunk into the snapshot store and recording the address of the copied chunk in the snapshot store as part of the exception; and allowing the first chunk to be modified in the origin volume; if it is determined in step (d) that the first chunk is unshared: allowing the first chunk to be modified in the origin volume. (a) initializing entries of the data structure to indicate that the blocks are shared between the origin volume and one or more snapshot stores, wherein: each entry is associated with a chunk that includes multiple blocks and represents a granularity of snapshot copy-outs the data structure is implemented using a btree structure including a set of index nodes and leaf nodes, the leaf nodes including a header, a table of exceptions and a directory map; for each chunk, a list of exceptions is stored which includes a snapshot address and a bitmap specifying which snapshots share that exception; and exceptions for all snapshots are stored in the btree indexed by logical chunk address such that a logical chunk is shared unless all active snapshots have exceptions for that chunk; each entry is associated with a chunk that includes multiple blocks and represents a granularity of snapshot copy-outs the data structure is implemented using a btree structure including a set of index nodes and leaf nodes, the leaf nodes including a header, a table of exceptions and a directory map; for each chunk, a list of exceptions is stored which includes a snapshot address and a bitmap specifying which snapshots share that exception; and exceptions for all snapshots are stored in the btree indexed by logical chunk address such that a logical chunk is shared unless all active snapshots have exceptions for that chunk; (b) receiving a request to modify a first portion of the origin volume; (c) identifying a first chunk that contains the first portion to be modified; and (d) consulting the btree to determine whether or not all snapshots have exceptions for the first chunk and thus whether the first chunk is shared or unshared; and if it is determined in step (d) that the first chunk is shared: writing first metadata into an entry of the data structure to indicate that the first chunk is unshared, wherein writing the first metadata comprises associating the first chunk with one of the leaf nodes in the btree structure and creating an exception for the associated leaf node for the chunk to indicate that the chunk in unshared; copying data of the first chunk into the snapshot store and recording the address of the copied chunk in the snapshot store as part of the exception; and allowing the first chunk to be modified in the origin volume; if it is determined in step (d) that the first chunk is unshared: allowing the first chunk to be modified in the origin volume. writing first metadata into an entry of the data structure to indicate that the first chunk is unshared, wherein writing the first metadata comprises associating the first chunk with one of the leaf nodes in the btree structure and creating an exception for the associated leaf node for the chunk to indicate that the chunk in unshared; copying data of the first chunk into the snapshot store and recording the address of the copied chunk in the snapshot store as part of the exception; and allowing the first chunk to be modified in the origin volume; allowing the first chunk to be modified in the origin volume.