We also have to deal with the block pointers in the inodes. Each inode can store the address of 12 blocks to store the data. So what happens when you need more then 12 blocks to store the data?
You use indirect block pointers, instead of pointing at blocks of data. You point at blocks that point to the blocks. Basically lists of lists.
The first layer of this is called single indirect block pointers, the lists of lists. Then we go to double indirect block pointers. Lists of lists of lists. Then down to triple indirect block pointers, lists of lists of lists of lists.