BarryServer : Git

All the code for all my projects
// BarryServer : Git / Orion / blob / 1628fcfdfdf2978ed9ccac96ee7d13bb3dc43a01 / vfs / ext2fs / fs.h

// Related

Orion

Barry Importing existing Orion kernel d41a53c (2 years, 4 months ago)
#ifndef KERNEL_VFS_EXT2FS_H
#define KERNEL_VFS_EXT2FS_H

#include "../vfs.h"

typedef struct Ext2Super Ext2Super;
typedef struct Ext2BlockGroupDesc Ext2BlockGroupDesc;
typedef struct Ext2Inode Ext2Inode;
typedef struct Ext2DirEntry Ext2DirEntry;

/* Structure of the Ext2 SuperBlock */
struct Ext2Super {
	uint32_t numInodes;
	uint32_t numBlocks;
	uint32_t reservedBlocks;
	uint32_t unallocBlocks;
	uint32_t unallocInodes;
	uint32_t superBlock;
	uint32_t blockSize;
	uint32_t fragSize;
	uint32_t blocksPerGroup;
	uint32_t fragsPerGroup;
	uint32_t inodesPerGroup;
	uint32_t lastMountTime;
	uint32_t lastWriteTime;
	uint16_t lastCheck;
	uint16_t mustCheck;
	uint16_t signature;
	uint16_t state;
	uint16_t error;
	uint16_t verMinor;
	uint32_t lastCheckTime;
	uint32_t checkInterval;
	uint32_t creator;
	uint32_t verMajor;
	uint16_t uid, gid;
	/* Extended fields */
	uint32_t firstAvailInode;
	uint16_t inodeSize;
	uint16_t blockGroup;
	uint32_t optionalFeatures;
	uint32_t requiredFeatures;
	uint32_t writableFeatures;
	char fsId[16];
	char volumeName[16];
	char lastPath[64];
	uint32_t compression;
	uint8_t preallocFileBlocks;
	uint8_t preallocDirBlocks;
	uint16_t unused;
	char journalId[16];
	uint32_t journalInode;
	uint32_t journalDev;
	uint32_t orphanHead;
} __attribute__((packed));

/* Structure of the Ext2 Block Group Descriptor */
struct Ext2BlockGroupDesc {
	uint32_t blockUsage;
	uint32_t inodeUsage;
	uint32_t inodeTable;
	uint16_t unallocBlocks;
	uint16_t unallocInodes;
	uint16_t numDirs;
} __attribute__((packed));

/* Structure of the Ext2 Inode */
struct Ext2Inode {
	uint16_t type;
	uint16_t uid;
	uint32_t lsize;
	uint32_t lastAccessTime;
	uint32_t creationTime;
	uint32_t lastWriteTime;
	uint32_t deletionTime;
	uint16_t gid;
	uint16_t numHardLinks;
	uint32_t numSectors;
	uint32_t flags;
	uint32_t osA;
	uint32_t directBlock[12];
	uint32_t singleBlock;
	uint32_t doubleBlock;
	uint32_t tripleBlock;
	uint32_t gen;
	uint32_t attr;
	union {
		uint32_t usize;
		uint32_t dirACL;
	};
	uint32_t fragment;
	uint32_t osB[3];
} __attribute__((packed));

/* Structure of the Ext2 Directory Entry */
struct Ext2DirEntry {
	uint32_t ino;
	uint16_t size;
	uint8_t nameLen;
	uint8_t type;
	char name[];
} __attribute__((packed));

/* Operations */
extern SuperOps ext2fsSuperOps;
extern InodeOps ext2fsInodeOps;
extern FileOps ext2fsFileOps;

extern FileSystemType ext2fsType;

void ext2_read_vnode(SuperBlock *super, uint32_t index, Inode *res);
void ext2_read_inode(SuperBlock *super, uint32_t index, Ext2Inode *res);
void ext2_read_block(SuperBlock *super, uint32_t index, char *buf);
uint32_t ext2_get_data_addr(SuperBlock *super, Ext2Inode *node, uint32_t index);

#endif