66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  | Copyright (C) 2016-2019 The University of Notre Dame | ||
|  | This software is distributed under the GNU General Public License. | ||
|  | See the file LICENSE for details. | ||
|  | */ | ||
|  | 
 | ||
|  | #ifndef DISKFS_H
 | ||
|  | #define DISKFS_H
 | ||
|  | 
 | ||
|  | #include "kernel/types.h"
 | ||
|  | 
 | ||
|  | #define DISKFS_MAGIC 0xabcd4321
 | ||
|  | #define DISKFS_BLOCK_SIZE 4096
 | ||
|  | #define DISKFS_DIRECT_POINTERS 6
 | ||
|  | #define DISKFS_INODES_PER_BLOCK (DISKFS_BLOCK_SIZE/sizeof(struct diskfs_inode))
 | ||
|  | #define DISKFS_ITEMS_PER_BLOCK (DISKFS_BLOCK_SIZE/sizeof(struct diskfs_item))
 | ||
|  | #define DISKFS_POINTERS_PER_BLOCK (DISKFS_BLOCK_SIZE/sizeof(uint32_t))
 | ||
|  | 
 | ||
|  | struct diskfs_superblock { | ||
|  | 	uint32_t magic; | ||
|  | 	uint32_t block_size; | ||
|  | 	uint32_t inode_start; | ||
|  | 	uint32_t inode_blocks; | ||
|  | 	uint32_t bitmap_start; | ||
|  | 	uint32_t bitmap_blocks; | ||
|  | 	uint32_t data_start; | ||
|  | 	uint32_t data_blocks; | ||
|  | }; | ||
|  | 
 | ||
|  | struct diskfs_inode { | ||
|  | 	uint32_t inuse; // reserve for broader use.
 | ||
|  | 	uint32_t size; | ||
|  | 	uint32_t direct[DISKFS_DIRECT_POINTERS]; | ||
|  | 	uint32_t indirect; | ||
|  | }; | ||
|  | 
 | ||
|  | #define DISKFS_ITEM_BLANK 0
 | ||
|  | #define DISKFS_ITEM_FILE 1
 | ||
|  | #define DISKFS_ITEM_DIR 2
 | ||
|  | 
 | ||
|  | /* Maximum name length chosen so that diskfs_item is 32 bytes. */ | ||
|  | #define DISKFS_NAME_MAX 26
 | ||
|  | 
 | ||
|  | #pragma pack(1)
 | ||
|  | struct diskfs_item { | ||
|  | 	uint32_t inumber; | ||
|  | 	uint8_t  type; | ||
|  | 	uint8_t  name_length; | ||
|  | 	char     name[DISKFS_NAME_MAX]; | ||
|  | }; | ||
|  | #pragma pack()
 | ||
|  | 
 | ||
|  | struct diskfs_block { | ||
|  | 	union { | ||
|  | 		struct diskfs_superblock superblock; | ||
|  | 		struct diskfs_inode inodes[DISKFS_INODES_PER_BLOCK]; | ||
|  | 		struct diskfs_item items[DISKFS_ITEMS_PER_BLOCK]; | ||
|  | 		uint32_t pointers[DISKFS_POINTERS_PER_BLOCK]; | ||
|  | 		char     data[DISKFS_BLOCK_SIZE]; | ||
|  | 	}; | ||
|  | }; | ||
|  | 
 | ||
|  | int diskfs_init(void); | ||
|  | 
 | ||
|  | #endif
 |