2013-07-28 22:37:37 +05:30
2013-07-28 22:37:15 +05:30
2013-07-27 01:02:11 +05:30
2013-07-28 22:37:37 +05:30
2013-07-28 21:26:46 +05:30
2013-07-27 01:02:11 +05:30

A simple filesystem to understand things.

This is a Work In Progress. Do not use this yet.

The source files are licensed under Creative Commons Zero License.
More information at:	http://creativecommons.org/publicdomain/zero/1.0/
Full license text at:	http://creativecommons.org/publicdomain/zero/1.0/legalcode

Architecture + Notes
--------------------

Block Zero = Super block
Block One = Inode store
Block Two = Occupied by the initial file that is created as part of the mkfs.

Only a limited number of filesystem objects are supported.
A file cannot grow beyond one block. ENOSPC will be returned as an error on attempting to do.
Directories store the children inode number and name in their data blocks.
Read support is implemented.
Files and Directories can be created. Support for .create and .mkdir is implemented.
Basic write support is implemented. Writes may not succeed if done in an offset. Works when you overwrite the entire block.
Locks are not well thought-out. The current locking scheme works but needs more analysis + code reviews.
Memory leaks may (will ?) exist.


Credits
--------
All the source code is written by me (Sankar P) until this point. 

An O_LARGETHANKS to the guidance of VijaiBabu M and Santosh Venugopal. Their excellent talks on filesystems motivated me to implement a file system from the scratch. Without their inspirational speeches, I would not have focussed on filesystems.

A big thanks should go to the kernelnewbies mailing list for helping me with clarifying the nitty-gritties of the linux kernel, especially people like Mulyadi Santosa, Valdis Kletnieks, Manish Katiyar, Rajat Sharma etc.


TODO
-----
- Check the locks. Remove/Add as necessary.
- Send for review
- Make a 1.0 release
- After the 1.0 release, start with support for extents, which on completion will be 2.0
- After the 2.0 release, start with journalling support, which on completion will be 3.0


How To ?
--------
If you are planning to learn filesystems, start from the scratch. You can look from the first commit in this repository and move the way up.


To compile:
------------
install linux kernel sources and run make from the checkedout directory.


To test:
---------

psankar@linux-9dni:~/src/simplefs> make

psankar@linux-9dni:~/src/simplefs> dd bs=4096 count=100 if=/dev/zero of=image
100+0 records in
100+0 records out
409600 bytes (410 kB) copied, 0.00106827 s, 383 MB/s
psankar@linux-9dni:~/src/simplefs> ./mkfs-simplefs image 
Super block written succesfully
root directory inode written succesfully
welcomefile inode written succesfully
inode store padding bytes (after the two inodes) written sucessfully
root directory datablocks (name+inode_no pair for welcomefile) written succesfully
padding after the rootdirectory children written succesfully
welcomefilebody has been written succesfully

psankar@linux-9dni:~/src/simplefs>

Now as root:
linux-9dni:/home/psankar/src/simplefs # insmod simplefs.ko ; mount -o loop -t simplefs image /home/psankar/src/simplefs/mount/ ; dmesg
[ 7064.752268] Sucessfully registered simplefs
[ 7064.756404] The magic number obtained in disk is: [268640275]
[ 7064.756410] simplefs filesystem of version [1] formatted with a block size of [4096] detected in the device.
[ 7064.756457] simplefs is succesfully mounted on [/dev/loop10]
linux-9dni:/home/psankar/src/simplefs # cd mount/
linux-9dni:/home/psankar/src/simplefs/mount # cat vanakkam
Love is God. God is Love. Anbe Murugan.
linux-9dni:/home/psankar/src/simplefs/mount # cp vanakkam hello
linux-9dni:/home/psankar/src/simplefs/mount # cat hello
Love is God. God is Love. Anbe Murugan.
linux-9dni:/home/psankar/src/simplefs/mount # echo "Let there be files :-)" > hello
linux-9dni:/home/psankar/src/simplefs/mount # cat hello
Let there be files :-)
linux-9dni:/home/psankar/src/simplefs/mount # touch world
linux-9dni:/home/psankar/src/simplefs/mount # cat world
linux-9dni:/home/psankar/src/simplefs/mount # echo "Hello World" > world
linux-9dni:/home/psankar/src/simplefs/mount # cat world
Hello World
linux-9dni:/home/psankar/src/simplefs/mount # ..
linux-9dni:/home/psankar/src/simplefs # umount mount ; rmmod simplefs.ko
linux-9dni:/home/psankar/src/simplefs # insmod simplefs.ko ; mount -o loop -t simplefs image /home/psankar/src/simplefs/mount/
linux-9dni:/home/psankar/src/simplefs # cd mount/
linux-9dni:/home/psankar/src/simplefs/mount # cat world
Hello World
linux-9dni:/home/psankar/src/simplefs/mount # cat hello
Let there be files :-)
linux-9dni:/home/psankar/src/simplefs/mount # ..
linux-9dni:/home/psankar/src/simplefs # umount mount ; rmmod simplefs.ko ; dmesg -c
[ 7064.752268] Sucessfully registered simplefs
[ 7064.756404] The magic number obtained in disk is: [268640275]
[ 7064.756410] simplefs filesystem of version [1] formatted with a block size of [4096] detected in the device.
[ 7064.756457] simplefs is succesfully mounted on [/dev/loop10]
[ 7070.816973] Read request for file of size: [41]
[ 7081.274818] No inode found for the filename [hello]
[ 7081.274835] No inode found for the filename [hello]
[ 7081.274853] No inode found for the filename [hello]
[ 7081.274874] simplefs create fs object is called
[ 7081.274888] Got new unique inode number [10]
[ 7081.274890] New file creation request
[ 7081.275037] Returning success after creating the file/directory
[ 7081.275050] Read request for file of size: [41]
[ 7081.275054] file size write begins
[ 7081.275067] The new filesize that is written is: [41] and len was: [41]
[ 7083.645271] Read request for file of size: [41]
[ 7118.672573] file size write begins
[ 7118.672655] The new filesize that is written is: [23] and len was: [23]
[ 7120.387921] Read request for file of size: [23]
[ 7129.434414] No inode found for the filename [world]
[ 7129.434424] simplefs create fs object is called
[ 7129.434429] Got new unique inode number [11]
[ 7129.434430] New file creation request
[ 7129.434568] Returning success after creating the file/directory
[ 7131.279727] Read request for file of size: [0]
[ 7140.382962] file size write begins
[ 7140.383083] The new filesize that is written is: [12] and len was: [12]
[ 7142.150113] Read request for file of size: [12]
[ 7153.773088] simplefs superblock is destroyed. Unmount succesful.
[ 7153.778315] Sucessfully unregistered simplefs
[ 7163.614771] Sucessfully registered simplefs
[ 7163.618539] The magic number obtained in disk is: [268640275]
[ 7163.618546] simplefs filesystem of version [1] formatted with a block size of [4096] detected in the device.
[ 7163.618587] simplefs is succesfully mounted on [/dev/loop11]
[ 7173.341241] Read request for file of size: [12]
[ 7181.062284] Read request for file of size: [23]
[ 7195.867825] simplefs superblock is destroyed. Unmount succesful.
[ 7195.872485] Sucessfully unregistered simplefs
linux-9dni:/home/psankar/src/simplefs # 

Description
A simple, kernel-space, on-disk filesystem from the scratch
Readme 158 KiB
Languages
C 92.7%
Shell 6.5%
Makefile 0.8%