A computer program product comprising computer-readable program instructions which, when running on or loaded into a data storage system, cause the data storage system to execute a method for managing a file system, the method comprising: - maintaining a plurality of superblocks (202, 203), each superblock being associated with one of plurality of checkpoints and representing a version of the file system including a current version of the file system represented by a first superblock of the plurality of superblocks and at least one checkpoint version of the file system represented by at least one second superblock of the plurality of superblocks; - maintaining a plurality of indirection objects (204, 205), each indirection object comprising a respective tree structure including a root node of the respective indirection object; and - managing a plurality of objects (206, 208) other than the indirection objects (204, 205), each of the other objects comprising a respective tree structure including a root node of the respective other object; wherein each of the plurality of superblocks (202, 203) includes a reference to the root node of at least one of the indirection objects (204, 205) such that each of the indirection objects is referenced by at least one of the plurality of superblocks (202, 203), and each of the indirection objects includes a reference to the root node of at least one of the other objects (206, 208) such that each of the other objects is referenced by at least one of the indirection objects (204, 205); wherein, by using an indirection object referenced by the first superblock and at least one indirection object referenced by the at least one second superblock, the method comprises maintaining the current version of the file system and retaining the at least one checkpoint version of the file system; wherein each superblock stores a respective checkpoint number being associated with the respective superblock and, for each of the objects including the indirection object, the root node (302; 2302) of the respective object includes a checkpoint number identifying a respective checkpoint in which the respective object was last modified; and wherein, for each of the objects including the indirection object, the root node (302; 2302) of the respective object includes a pointer to an older root node version of the respective root node if there is one. - maintaining a plurality of superblocks (202, 203), each superblock being associated with one of plurality of checkpoints and representing a version of the file system including a current version of the file system represented by a first superblock of the plurality of superblocks and at least one checkpoint version of the file system represented by at least one second superblock of the plurality of superblocks; - maintaining a plurality of indirection objects (204, 205), each indirection object comprising a respective tree structure including a root node of the respective indirection object; and - managing a plurality of objects (206, 208) other than the indirection objects (204, 205), each of the other objects comprising a respective tree structure including a root node of the respective other object;