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
|