diff options
Diffstat (limited to 'kernel/fs')
| -rw-r--r-- | kernel/fs/block.c | 10 | ||||
| -rw-r--r-- | kernel/fs/fs.c | 28 | ||||
| -rw-r--r-- | kernel/fs/mount.c | 35 |
3 files changed, 73 insertions, 0 deletions
diff --git a/kernel/fs/block.c b/kernel/fs/block.c new file mode 100644 index 0000000..b3f7386 --- /dev/null +++ b/kernel/fs/block.c @@ -0,0 +1,10 @@ +#include <kernel/hd.h> +#include <sys/types.h> + +size_t block_read(void *buf, size_t block, size_t len) { + return hd_read_block(buf, block, len); +} + +size_t block_write(void *buf, size_t block, size_t len) { + return hd_write_block(buf, block, len); +} diff --git a/kernel/fs/fs.c b/kernel/fs/fs.c new file mode 100644 index 0000000..792668e --- /dev/null +++ b/kernel/fs/fs.c @@ -0,0 +1,28 @@ +#include <kernel/con.h> +#include <kernel/fs.h> +#include <kernel/hd.h> +#include <kernel/kernel.h> +#include <kernel/sched.h> +#include <kernel/tty.h> +#include <string.h> +#include <sys/types.h> + +/* master file table */ +static struct file ftable[NRFILE]; + +ssize_t sys_read(void *buf, size_t len) { + return tty_read(ctask->ctty, buf, len); +} + +ssize_t sys_write(void *buf, size_t len) { + return tty_write(ctask->ctty, buf, len); +} + +void fs_init(void) { + memset(&sblocks, 0, sizeof(sblocks)); + memset(&ftable, 0, sizeof(ftable)); + + hd_init(); + + mount_root(); +} diff --git a/kernel/fs/mount.c b/kernel/fs/mount.c new file mode 100644 index 0000000..47911fb --- /dev/null +++ b/kernel/fs/mount.c @@ -0,0 +1,35 @@ +#include <kernel/con.h> +#include <kernel/fs.h> +#include <string.h> + +/* super blocks table */ +struct super_block sblocks[NRSUPER]; + +void mount_root(void) { + size_t ret; + char buf[BLOCK_SIZE]; + struct super_block *s = (void*) buf; + + ret = block_read(buf, 1, 1); + if(ret < 1) { + printk("[fs] Failed to read super block\n"); + return; + } + + if(s->s_magic != SUPER_MAGIC) { + printk("[fs] Invalid magic number in super block!\n"); + return; + } + + printk("[fs] Found valid super-block for /\n"); + printk(" 0x%01x inodes\n", s->s_ninodes); + printk(" 0x%01x zones\n", s->s_nzones); + printk(" 0x%01x inode block bitmaps\n", s->s_imap_blocks); + printk(" 0x%01x zone block bitmaps\n", s->s_zmap_blocks); + printk(" First data zone: 0x%01x\n", s->s_firstdatazone); + printk(" Log zone size: 0x%01x\n", s->s_log_zone_size); + printk(" Max file size: 0x%01x\n", s->s_max_size); + + /* copy the super block into the table */ + memcpy(sblocks, buf, ((unsigned) &s->s_imap - (unsigned) s)); +} |
