From ee63a84c0ef7eeaccdfc4a5b760fee5cdc1287b8 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 31 Dec 2004 22:00:00 -0500 Subject: [PATCH] Import backup from 2004-12-31 --- kernel/fs/ext2.c | 79 ++++++++++++++++++++++++++++++++++++++++++------ kernel/fs/ext2.h | 29 ++++++++++++++++-- kernel/fs/vfs.c | 11 ++++--- kernel/fs/vfs.h | 26 ++++++++-------- kernel/kernel.c | 2 +- 5 files changed, 117 insertions(+), 30 deletions(-) diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c index 165fb86..78ebea5 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -16,7 +16,11 @@ * group = (inode - 1) / s_inodes_per_group * index = (inode - 1) % s_inodes_per_group */ - + +vfs_fs_t ext2_driver = {ext2_mount_super, ext2_umount_super, ext2_stat, + ext2__open_dir, ext2__read_dir, ext2__close_dir, + ext2__open_file, ext2__read_file, ext2__close_file, + ext2__open_block_file, ext2__read_block_file, ext2__close_block_file}; // initialize the filesystem driver int ext2_init(int fsID) @@ -24,12 +28,7 @@ int ext2_init(int fsID) vfs_fs_t *fs; if (( fs = New(vfs_fs_t) )) // give the VFS system our FS structure { - fs->mount_super = ext2_mount_super; - fs->umount_super = ext2_umount_super; - fs->stat = ext2_stat; - fs->open_dir = ext2__open_dir; - fs->read_dir = ext2__read_dir; - fs->close_dir = ext2__close_dir; + *fs = ext2_driver; vfs_register_fs(fsID, fs); return 0; } @@ -365,7 +364,7 @@ ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group) } -int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_dir_t *dir) +int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_file_t *dir) { u32_t dir_inode = ext2_get_inode_number(mount, file); if (!dir_inode) @@ -377,7 +376,7 @@ int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_dir_t *dir) return 0; } -int ext2__read_dir(vfs_mount_t *mount, vfs_open_dir_t *dir, vfs_dir_entry_t *dentry) +int ext2__read_dir(vfs_mount_t *mount, vfs_open_file_t *dir, vfs_dir_entry_t *dentry) { ext2_dir_entry_t t_dentry; int status = ext2_dir_read_entry(mount, dir->fs_data, &t_dentry); @@ -388,10 +387,70 @@ int ext2__read_dir(vfs_mount_t *mount, vfs_open_dir_t *dir, vfs_dir_entry_t *den return 0; } -int ext2__close_dir(vfs_mount_t *mount, vfs_open_dir_t *dir) +int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir) { return ext2_close_dir(mount, dir->fs_data); } +int ext2__open_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file) +{ +} + +int ext2__read_file(vfs_mount_t *mount, vfs_open_file_t *open_file) +{ +} + +int ext2__close_file(vfs_mount_t *mount, vfs_open_file_t *open_file) +{ +} + + +int ext2__open_block_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file) +{ + u32_t file_inode = ext2_get_inode_number(mount, file); + if (!file_inode) + return -1; + ext2_open_inode_t *open_inode = ext2_open_inode(mount, file_inode); + if (!open_inode) + return -2; + ext2__open_block_file_t *open_block_file = New(ext2__open_block_file_t); + open_block_file->open_inode = open_inode; + open_block_file->block = 0; + open_file->fs_data = open_block_file; + return 0; +} + +// returns the number of bytes read +int ext2__read_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer) +{ + ext2_super_block_t *super = mount->super; + ext2__open_block_file_t *open_block_file = open_file->fs_data; + if (ext2_inode_seek(mount, open_block_file->open_inode, ext2_diskToFSBlock(open_block_file->block, super))) + return 0; // EOF + u8_t *block = kmalloc(1024 << super->s_log_block_size); + u32_t file_position_read = (1024 << super->s_log_block_size) * open_block_file->open_inode->block; + u32_t file_position_want = open_block_file->block << 9; + u32_t data_offset = file_position_want - file_position_read; + int bytes_read = ext2_read_inode_block(mount, open_block_file->open_inode, block); + if (bytes_read <= data_offset) + { + kfree(block); + return 0; // EOF + } + memcpy(buffer, block + data_offset, 512); + kfree(block); + return min(512, bytes_read - data_offset); +} + +int ext2__close_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file) +{ + ext2__open_block_file_t *open_block_file = open_file->fs_data; + ext2_close_inode(mount, open_block_file->open_inode); + kfree(open_block_file); + return 0; +} + + + diff --git a/kernel/fs/ext2.h b/kernel/fs/ext2.h index e2cf303..2a4f0c5 100644 --- a/kernel/fs/ext2.h +++ b/kernel/fs/ext2.h @@ -153,6 +153,21 @@ typedef struct u32_t position; } ext2_open_dir_t; +typedef struct +{ + ext2_open_inode_t *open_inode; + u32_t position; + u32_t buffer_start; + u32_t buffer_bytes; + u8_t *buffer; +} ext2__open_file_t; + +typedef struct +{ + ext2_open_inode_t *open_inode; + u32_t block; +} ext2__open_block_file_t; + static inline u32_t ext2_diskToFSBlock(u32_t block, ext2_super_block_t *super) { // convert # of disk blocks to # of filesystem blocks @@ -186,9 +201,17 @@ int ext2_dir_read_entry(vfs_mount_t *mount, ext2_open_dir_t *open_dir, ext2_dir_ int ext2_close_dir(vfs_mount_t *mount, ext2_open_dir_t *open_dir); int ext2_dir_lookup(vfs_mount_t *mount, u32_t dir_inode, char *fileName, ext2_dir_entry_t *direntry); -int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_dir_t *dir); -int ext2__read_dir(vfs_mount_t *mount, vfs_open_dir_t *dir, vfs_dir_entry_t *dentry); -int ext2__close_dir(vfs_mount_t *mount, vfs_open_dir_t *dir); +int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_file_t *dir); +int ext2__read_dir(vfs_mount_t *mount, vfs_open_file_t *dir, vfs_dir_entry_t *dentry); +int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir); + +int ext2__open_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file); +int ext2__read_file(vfs_mount_t *mount, vfs_open_file_t *open_file); +int ext2__close_file(vfs_mount_t *mount, vfs_open_file_t *open_file); + +int ext2__open_block_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file); +int ext2__read_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer); +int ext2__close_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file); #endif diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index b40c919..bbbc199 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -253,12 +253,12 @@ int vfs_stat(char *file, vfs_stat_t *stat) } -vfs_open_dir_t *vfs_open_dir(char *file) +vfs_open_file_t *vfs_open_dir(char *file) { vfs_mount_match_t match = vfs_get_rel_path(file); if (match.mount == NULL) return NULL; - vfs_open_dir_t *open_dir = New(vfs_open_dir_t); + vfs_open_file_t *open_dir = New(vfs_open_file_t); if (fses[match.mount->fs]->open_dir && !(fses[match.mount->fs]->open_dir(match.mount, file + match.length - 1, open_dir))) { open_dir->mount = match.mount; @@ -269,13 +269,13 @@ vfs_open_dir_t *vfs_open_dir(char *file) } -int vfs_read_dir(vfs_open_dir_t *open_dir, vfs_dir_entry_t *dentry) +int vfs_read_dir(vfs_open_file_t *open_dir, vfs_dir_entry_t *dentry) { return !(fses[open_dir->mount->fs]->read_dir && !(fses[open_dir->mount->fs]->read_dir(open_dir->mount, open_dir, dentry))); } -int vfs_close_dir(vfs_open_dir_t *open_dir) +int vfs_close_dir(vfs_open_file_t *open_dir) { int status = 0; if (fses[open_dir->mount->fs]->close_dir) @@ -285,6 +285,9 @@ int vfs_close_dir(vfs_open_dir_t *open_dir) } + + + // DEBUG routines to draw the VFS Mount Tree /******************************************/ void vfs_dump_tree() diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h index fc5927b..1cf61e9 100644 --- a/kernel/fs/vfs.h +++ b/kernel/fs/vfs.h @@ -69,12 +69,6 @@ typedef struct u16_t links; } vfs_stat_t; -typedef struct -{ - vfs_mount_t *mount; - void *fs_data; -} vfs_open_dir_t; - typedef struct { vfs_mount_t *mount; @@ -93,9 +87,17 @@ typedef struct int (*umount_super)(vfs_mount_t *mount); int (*stat)(vfs_mount_t *mount, char *file, vfs_stat_t *stat); - int (*open_dir)(vfs_mount_t *mount, char *file, vfs_open_dir_t *dir); - int (*read_dir)(vfs_mount_t *mount, vfs_open_dir_t *dir, vfs_dir_entry_t *dentry); - int (*close_dir)(vfs_mount_t *mount, vfs_open_dir_t *dir); + int (*open_dir)(vfs_mount_t *mount, char *file, vfs_open_file_t *dir); + int (*read_dir)(vfs_mount_t *mount, vfs_open_file_t *dir, vfs_dir_entry_t *dentry); + int (*close_dir)(vfs_mount_t *mount, vfs_open_file_t *dir); + + int (*open_file)(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file); + int (*read_file)(vfs_mount_t *mount, vfs_open_file_t *open_file); + int (*close_file)(vfs_mount_t *mount, vfs_open_file_t *open_file); + + int (*open_block_file)(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file); + int (*read_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer); + int (*close_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file); } vfs_fs_t; @@ -111,9 +113,9 @@ int vfs_retire_node(vfs_node_t *node); int vfs_stat(char *file, vfs_stat_t *stat); -vfs_open_dir_t *vfs_open_dir(char *file); -int vfs_read_dir(vfs_open_dir_t *open_dir, vfs_dir_entry_t *dentry); -int vfs_close_dir(vfs_open_dir_t *open_dir); +vfs_open_file_t *vfs_open_dir(char *file); +int vfs_read_dir(vfs_open_file_t *open_dir, vfs_dir_entry_t *dentry); +int vfs_close_dir(vfs_open_file_t *open_dir); // DEBUG routines diff --git a/kernel/kernel.c b/kernel/kernel.c index f10d66d..62499e4 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -136,7 +136,7 @@ void k_init() } } - vfs_open_dir_t *open_dir = vfs_open_dir("/"); + vfs_open_file_t *open_dir = vfs_open_dir("/"); vfs_dir_entry_t dentry; vfs_stat_t stat; while (!vfs_read_dir(open_dir, &dentry))