BarryServer : Git

All the code for all my projects
// BarryServer : Git / Orion / blob / master / vfs / vfs.h

// Related

Orion

Barry Adding pipes e59e4fe (2 years, 4 months ago)
#ifndef KERNEL_VFS_H
#define KERNEL_VFS_H

#include <stdint.h>
#include <stddef.h>
#include <dirent.h>
#include <sys/stat.h>
#include "../spinlock.h"
#include "../mem/paging.h"

#define NFILES 32
#define NAME_MAX 255
#define PATH_MAX 1024

#define MAY_READ 4
#define MAY_WRITE 2
#define MAY_EXECUTE 1

typedef struct FileSystemType FileSystemType;
typedef struct SuperBlock SuperBlock;
typedef struct SuperOps SuperOps;
typedef struct Inode Inode;
typedef struct InodeOps InodeOps;
typedef struct File File;
typedef struct FileOps FileOps;
typedef struct DirEntry DirEntry;
typedef struct Page Page;
typedef struct PageCache PageCache;
typedef struct Custody Custody;
typedef struct CustodyChain CustodyChain;

/* Structure for a File System Type */
struct FileSystemType {
	const char *name;
	Inode *(*mount)(FileSystemType *, int, const char *, void *);
	void (*kill_sb)(SuperBlock *);
	pid_t owner;
	FileSystemType *next;
};

/* Structure for a Super Block */
struct SuperBlock {
	FileSystemType *type;
	SuperOps *ops;
	Spinlock lock;
	Inode *root;
	Inode *inodes; /* List of cached inodes */
	size_t cachedInodes;
	File *back;
	void *data;
};
struct SuperOps {
	Inode *(*alloc_inode)(SuperBlock *);
	int (*write_inode)(Inode *);
	void (*delete_inode)(Inode *);
};

/* Structure for an Inode */
struct Inode {
	ino_t ino;
	refcount_t usage;
	unsigned short uid, gid;
	mode_t mode;
	nlink_t nlink;
	uint32_t flags;
	size_t size;
	dev_t dev;
	Spinlock lock;
	InodeOps *ops;
	FileOps *fileOps;
	void *extra;
	void (*free_extra)(Inode *);
	SuperBlock *super;
	union {
		DirEntry *dirEntries; /* List of Directory Entries */
		PageCache *pages; /* List of Pages */
	};
	Inode *lnext; /* Next inode in super's list */
};
struct InodeOps {
	int (*create)(Inode *, DirEntry *, mode_t);
	Inode *(*lookup)(Inode *, const char *);
	int (*mkdir)(Inode *, DirEntry *, mode_t);
	int (*rmdir)(Inode *, DirEntry *);
	int (*mknod)(Inode *, DirEntry *, mode_t, dev_t);
	int (*rename) (Inode *, DirEntry *, Inode *, DirEntry *);
};

/* Structure for an open File */
struct File {
	Inode *inode;
	unsigned short uid, gid;
	int flags;
	mode_t mode;
	off_t pos;
	Spinlock lock;
	FileOps *ops;
	CustodyChain *path;
	refcount_t usage;
};
struct FileOps {
	off_t (*lseek)(File *, off_t, int);
	size_t (*read)(File *, char *, size_t, off_t);
	size_t (*write)(File *, char *, size_t, off_t);
	int (*ioctl)(File *, unsigned long, uintptr_t);
	int (*readdir)(File *, DirEnt *, off_t);
	int (*open)(File *);
	int (*flush)(File *);
	int (*release)(File *);
	void (*mmap)(File *, void *, size_t, off_t);
};

/* Structure for a Directory Entry */
struct DirEntry {
	DirEntry *next;
	Inode *inode, *mnt;
	uint32_t hash;
	char name[NAME_MAX];
	Spinlock lock;
	SuperBlock *super;
	refcount_t usage;
	DirEntry *lnext; /* Next directory entry in global list */
};

/* Structure for a Page in a block cache */
struct Page {
	page_t frame;
	off_t offset;
	refcount_t usage;
};
struct PageCache {
        Page *page;
        PageCache *next;
};

/* Custody Chains */
struct Custody {
	Custody *prev, *next;
	CustodyChain *chain;
	DirEntry *entry;
};
struct CustodyChain {
	Custody *start, *end;
	size_t size;
	Spinlock lock;
};

/* File System Namespace */
typedef struct FileSystem {
	Inode *cwd;
	CustodyChain cwdCustody;
	Inode *root;
	refcount_t usage;
} FileSystem;

/* Files Namespace */
typedef struct Files {
	File *fd[NFILES];
	refcount_t usage;
} Files;

void init_vfs(void);
void register_fstype(FileSystemType *fstype);
Inode *lookup(const char *name, CustodyChain *chain);

int open(const char *name, int flags, ...); /* mode_t mode */
int close(int fd);
int read(int fd, void *buf, size_t count);
int write(int fd, void *buf, size_t count);
int ioctl(int fd, unsigned long request, ...);
off_t lseek(int fd, off_t offset, int whence);
int stat(const char *pathname, struct stat *statbuf);
size_t getdents(int fd, void *buf, size_t count);
int mkdir(const char *pathname, mode_t mode);
int rmdir(const char *pathname);
int mknod(const char *pathname, mode_t mode, dev_t dev);
int rename(const char *oldpath, const char *newpath);
int dup(int oldfd);
int dup2(int oldfd, int newfd);
int pipe(int pipefd[2]);
int mount(const char *src, const char *target, const char *type,
          unsigned long flags, void *data);
int chdir(const char *path);
int chroot(const char *path);
char *getcwd(char *buf, size_t size);

void init_custody_chain(CustodyChain *chain);
CustodyChain *create_custody_chain(void);
void clean_custody_chain(CustodyChain *chain);
void destroy_custody_chain(CustodyChain *chain);
void copy_custody_chain(CustodyChain *chain, CustodyChain *newchain);
void add_custody(CustodyChain *chain, DirEntry *entry);
DirEntry *remove_custody(CustodyChain *chain);
char *custody_path(CustodyChain *chain, char *buf, size_t size);

File *file_get(File *file);
void file_put(File *file);
size_t file_read(File *file, char *buf, size_t size);
size_t file_write(File *file, char *buf, size_t size);
int file_ioctl(File *file, unsigned long reqeust, uintptr_t argp);
int file_readdir(File *file, DirEnt *dent, off_t index);
int file_open(File *file);
void file_mmap(File *file, void *buf, size_t len, off_t offset);

#endif