basekernel/kernel/diskfs.h

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