Import backup from 2004-12-31

This commit is contained in:
Josh Holtrop 2004-12-31 22:00:00 -05:00
parent 76a243d894
commit ee63a84c0e
5 changed files with 117 additions and 30 deletions

View File

@ -17,6 +17,10 @@
* 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;
}

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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))