1. A method of performing incremental garbage collection to free up a first block of a non-volatile memory, wherein the first block comprises memory locations storing valid data and invalid data, the method comprising: receiving a first write request to write first user data to the non-volatile memory; and in response to receiving the first write request: programming the first user data to a second block of the non-volatile memory; and copying a first portion of the valid data from the first block to the second block of the non-volatile memory.