Minimal working vfs refactor

This commit is contained in:
Mark
2020-01-10 15:37:54 +02:00
parent 7272b762c0
commit 2e795d2ebf
18 changed files with 582 additions and 640 deletions
+21 -15
View File
@@ -1,12 +1,15 @@
#pragma once
#include "sys/types.h"
struct vnode;
// TODO: something like device name alias
// for example, /dev/root aliased to
// /dev/ramN or /dev/sdXN
enum dev_class {
DEV_CLASS_BLOCK,
DEV_CLASS_CHAR
DEV_CLASS_BLOCK = 1,
DEV_CLASS_CHAR = 2,
DEV_CLASS_ANY = 255
};
#define DEV_BLOCK_SDx 1
@@ -17,19 +20,22 @@ enum dev_class {
#define DEV_CHAR_TTY 1
struct dev_entry {
char dev_name[64];
int dev_add(enum dev_class cls, int subcls, void *dev, const char *name);
int dev_find(enum dev_class cls, const char *name, struct vnode **dev_node);
enum dev_class dev_class;
uint16_t dev_subclass;
uint16_t dev_number;
//struct dev_entry {
// char dev_name[64];
//
// enum dev_class dev_class;
// uint16_t dev_subclass;
// uint16_t dev_number;
//
// void *dev;
// struct dev_entry *cdr;
//};
void *dev;
struct dev_entry *cdr;
};
//struct dev_entry *dev_iter(void);
struct dev_entry *dev_iter(void);
int dev_alloc_name(enum dev_class cls, uint16_t subclass, char *name);
int dev_by_name(struct dev_entry **ent, const char *name);
void dev_entry_add(struct dev_entry *ent);
//int dev_alloc_name(enum dev_class cls, uint16_t subclass, char *name);
//int dev_by_name(struct dev_entry **ent, const char *name);
//void dev_entry_add(struct dev_entry *ent);
+15 -15
View File
@@ -124,24 +124,24 @@ void ext2_class_init(void);
enum vnode_type ext2_inode_type(struct ext2_inode *i);
// Implemented in ext2blk.c
int ext2_write_superblock(fs_t *ext2);
int ext2_read_block(fs_t *ext2, uint32_t block_no, void *buf);
int ext2_write_block(fs_t *ext2, uint32_t block_no, const void *buf);
int ext2_read_inode_block(fs_t *ext2, struct ext2_inode *inode, uint32_t index, void *buf);
int ext2_write_inode_block(fs_t *ext2, struct ext2_inode *inode, uint32_t index, const void *buf);
int ext2_read_inode(fs_t *ext2, struct ext2_inode *inode, uint32_t ino);
int ext2_write_inode(fs_t *ext2, const struct ext2_inode *inode, uint32_t ino);
int ext2_write_superblock(struct fs *ext2);
int ext2_read_block(struct fs *ext2, uint32_t block_no, void *buf);
int ext2_write_block(struct fs *ext2, uint32_t block_no, const void *buf);
int ext2_read_inode_block(struct fs *ext2, struct ext2_inode *inode, uint32_t index, void *buf);
int ext2_write_inode_block(struct fs *ext2, struct ext2_inode *inode, uint32_t index, const void *buf);
int ext2_read_inode(struct fs *ext2, struct ext2_inode *inode, uint32_t ino);
int ext2_write_inode(struct fs *ext2, const struct ext2_inode *inode, uint32_t ino);
// Implemented in ext2alloc.c
int ext2_alloc_block(fs_t *ext2, uint32_t *block_no);
int ext2_free_block(fs_t *ext2, uint32_t block_no);
int ext2_inode_alloc_block(fs_t *ext2, struct ext2_inode *inode, uint32_t ino, uint32_t index);
int ext2_free_inode_block(fs_t *ext2, struct ext2_inode *inode, uint32_t ino, uint32_t index);
int ext2_free_inode(fs_t *ext2, uint32_t ino);
int ext2_alloc_inode(fs_t *ext2, uint32_t *ino);
int ext2_alloc_block(struct fs *ext2, uint32_t *block_no);
int ext2_free_block(struct fs *ext2, uint32_t block_no);
int ext2_inode_alloc_block(struct fs *ext2, struct ext2_inode *inode, uint32_t ino, uint32_t index);
int ext2_free_inode_block(struct fs *ext2, struct ext2_inode *inode, uint32_t ino, uint32_t index);
int ext2_free_inode(struct fs *ext2, uint32_t ino);
int ext2_alloc_inode(struct fs *ext2, uint32_t *ino);
// Implemented in ext2dir.c
int ext2_dir_add_inode(fs_t *ext2, struct vnode *dir, const char *name, uint32_t ino);
int ext2_dir_remove_inode(fs_t *ext2, struct vnode *dir, const char *name, uint32_t ino);
int ext2_dir_add_inode(struct fs *ext2, struct vnode *dir, const char *name, uint32_t ino);
int ext2_dir_remove_inode(struct fs *ext2, struct vnode *dir, const char *name, uint32_t ino);
extern struct vnode_operations ext2_vnode_ops;
+4 -7
View File
@@ -3,15 +3,15 @@
#include "sys/blk.h"
struct statvfs;
struct vfs_node;
struct fs_class {
char name[64];
int opt;
struct vnode *(*get_root) (fs_t *fs);
int (*mount) (struct fs *fs, const char *opt);
struct vnode *(*get_root) (struct fs *fs);
int (*init) (struct fs *fs, const char *opt);
int (*mount) (struct fs *fs);
int (*umount) (struct fs *fs);
int (*statvfs) (struct fs *fs, struct statvfs *st);
};
@@ -19,9 +19,6 @@ struct fs_class {
// The actual filesystem instance,
// one per each mount
struct fs {
// Mount details here
struct vnode *mnt_at;
// Block device on which the filesystem resides
struct blkdev *blk;
@@ -31,7 +28,7 @@ struct fs {
struct fs_class *cls;
};
struct fs *fs_create(struct fs_class *cls, struct blkdev *blk, struct vnode *mnt_at);
struct fs *fs_create(struct fs_class *cls, struct blkdev *blk);
void fs_release(struct fs *fs);
struct fs_class *fs_class_by_name(const char *name);
int fs_class_register(struct fs_class *cls);
+26 -29
View File
@@ -10,62 +10,48 @@
#define NODE_MAXLEN 256
// Means the node has no physical storage and resides only
// in memory
#define VN_MEMORY (1 << 0)
struct ofile;
struct vfs_ioctx;
struct vnode;
typedef struct fs fs_t;
struct fs;
enum vnode_type {
VN_REG,
VN_DIR,
VN_BLK,
VN_CHR,
// VN_LNK
VN_UNK,
};
struct vnode_operations {
// File tree traversal, node instance operations
int (*find) (struct vnode *node, const char *path, struct vnode **res);
void (*destroy) (struct vnode *node);
// Symlink
// int (*readlink) (struct vnode *node, char *path);
// int (*symlink) (struct vnode *at, struct vfs_ioctx *ctx, const char *name, const char *dst);
// File entry operations
int (*access) (struct vnode *node, uid_t *uid, gid_t *gid, mode_t *mode);
int (*creat) (struct vnode *node, struct vfs_ioctx *ctx, const char *name, mode_t mode, int opt, struct vnode **res);
int (*mkdir) (struct vnode *at, const char *name, mode_t mode);
int (*unlink) (struct vnode *at, struct vnode *vn, const char *name);
int (*stat) (struct vnode *node, struct stat *st);
int (*chmod) (struct vnode *node, mode_t mode);
int (*chown) (struct vnode *node, uid_t uid, gid_t gid);
// Directory access
int (*opendir) (struct vnode *node, int opt);
int (*readdir) (struct ofile *fd);
// File access
int (*open) (struct vnode *node, int opt);
int (*open) (struct ofile *fd);
void (*close) (struct ofile *fd);
ssize_t (*read) (struct ofile *fd, void *buf, size_t count);
ssize_t (*write) (struct ofile *fd, const void *buf, size_t count);
int (*truncate) (struct ofile *fd, size_t length);
};
struct vnode {
enum vnode_type type;
char name[NODE_MAXLEN];
uint32_t flags;
struct vnode *first_child;
struct vnode *next_child;
struct vnode *parent;
uint32_t refcount;
uint32_t open_count;
uint64_t ino;
fs_t *fs;
gid_t gid;
uid_t uid;
struct fs *fs;
void *fs_data;
/*
* (struct blkdev *) if type == VN_BLK
@@ -76,4 +62,15 @@ struct vnode {
struct vnode_operations *op;
};
struct vnode *vnode_create(const char *name);
// Node itself
struct vnode *vnode_create(enum vnode_type t, const char *name);
// Tree manipulation
void vnode_attach(struct vnode *parent, struct vnode *child);
void vnode_detach(struct vnode *node);
// Tree traversal
void vnode_dump_tree(int level, struct vnode *node, int depth);
int vnode_lookup_child(struct vnode *of, const char *name, struct vnode **child);
int vnode_lookup_tree(struct vnode *at, const char *rel_path, struct vnode **child);