Import backup from 2004-12-31
This commit is contained in:
parent
76a243d894
commit
ee63a84c0e
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user