Minimal working vfs refactor
This commit is contained in:
+21
-15
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user