summaryrefslogtreecommitdiff
path: root/kernel/fs
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fs')
-rw-r--r--kernel/fs/block.c10
-rw-r--r--kernel/fs/fs.c28
-rw-r--r--kernel/fs/mount.c35
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));
+}