Make a detailed design of all of the different kinds of blocks that you expect to need (such as superblock, file headers, whatever is needed to implement the free list, etc), and define the structs that will hold them when in memory. Give especially careful consideration to just what meta-data should be in file headers and just how it should be represented, you need enough for it to be realistically useful. Decide how a disc will be formatted before its first use. Decide exactly how files and directories will be created, read, enlarged, modified, and deleted. Decide just what information, buffers, etc will need to be kept in memory while a file is open, and carefully design the struct(s) that will hold them. Work out what the major functions that will be the programmer's interface to your file system should be, and how they will work. Design the sub-functions that will do most of the work, in order to keep the implementation understandable and reliable, functions such as ... ... given a file name, find its header ... given a file header in its struct, find the Nth block of the file ... given a file header, add a new block to the end of the file ... get the next N bytes of data from an open file ... open a file ... close a file ... initialise the system - get everything ready to go before the first user-level function (such as create, open, read) can be called ... close down the system safely before the program exits ... and whatever else will be important The purpose of this is to give you a sensible plan to follow, so that when you do the programming you will know what you are doing, and won't waste a lot of time on ideas that won't work. Of course, you will make discoveries along the way, and have to make some modifications to the plan, but at least you will have a known, sensible design.