The layout of your 128 KB disk is as follows
char name[8]; //file name int size; // file size (in number of blocks) int blockPointers[8]; // direct block pointers int used; // 0 => inode is free; 1 => in use
Note that each inode is 56 bytes in size; Since you have 16 of these, the total size of occupied by the inodes is 896 bytes. The free/used block information (mentioned above) is 128 byes. So the total space used in the super block is 1024 bytes.
You need to implement the following operations for your file system.
javac CreateFS.java java CreateFS disk0or for C:
gcc -o create_fs create_fs.c ./create_fs disk0
This will create a file with the name
disk0in your current directory. The program also "formats" your file system---this is done by initializing all blocks in the super block to be free and marking all 16 inodes to be free.
You program should take input from a input file and perform actions specified in the file, while printing out the result of each action. The format of the input file is as follows.
diskName // name of the file that emulates the disk C fileName Size //create a file of this size D fileNAme // delete this file L // list all files on disk and their sizes R fileName blockNum // read this block from this file W fileName blockNum // write to this block in the file (use a dummy 1KB buffer)An sample input file looks like this:
disk0 C file1 3 W file1 0 W file1 1 C lab.java 7 L C file2 4 R file1 1 D lab.java LA sample input file is available. Be sure to print out what your program does after reading each line from this file. It'd also be helpful if you printed out the disk addresses of any block that you allocate, deallocate, read or write.
You will need to be completely familiar with the RandomAccessFile class in order to read and write to specific locations in the disk file. I strongly recommend that you read up on this class before starting on this assignment. In particular, you'll need to understand how to use the seek method to move the file pointer to a specific location in the file and then you can read/write at that location.
Once you understand how seek works, all you need to do is compute the byte offset of the object you are tying to access and seek to that location before reading or writing. Remember to count from 0!
Your file system can support a maximum file size of 8 blocks (8KB). That does NOT mean that every file will be 8KB in size. In most cases, files will be smaller than the max file size. Each "create" request should check whether the disk has sufficient space for the file and if not, return a "not enough space on disk" error message.
Feel free to do so in your file system program. HOWEVER, you should be very careful in what get written out to the disk. Since each inode has space allocated for exactly 8 characters (16 bytes) to hold the file name, you should always write out 8 characters to disk, regardless of the file size. If your file name is shorter, the unused characters should have the '\0' or spaces. Thus, if you use strings, you'll need to make sure exactly 8 characters are written out, regardless of the string length. We recommend that you use character arrays instead of strings if possible.
Most file operations will only touch the superblock (the free block list and the inode). However, the read and write calls need you to actually read and write data from the specified block on disk. In case of write, you can use a dummy buffer (e.g., with all 1s) to write to disk. Remember, what you write out is what should get read in if you use "read" at a later time.
You should be very careful about using code snippets you find on the Internet. In general your code should be your own. It is OK to read tutorials on the web and use these concepts in your assignment. Blind use of code from web is strictly disallowed. Feel free to check with us if you have questions on this policy. And be sure to document any Internet sources/ tutorials you have used to complete the assignment in your README file.