Import backup from 2004-12-22

This commit is contained in:
Josh Holtrop 2004-12-22 22:00:00 -05:00
parent 7b805f2495
commit 55b7429d4e
5 changed files with 152 additions and 5 deletions

View File

@ -61,8 +61,9 @@ initrd:
dd if=/dev/zero of=$(INITRD) bs=1024 count=$(INITRD_SIZE) dd if=/dev/zero of=$(INITRD) bs=1024 count=$(INITRD_SIZE)
mke2fs -Fv -m0 -r0 $(INITRD) mke2fs -Fv -m0 -r0 $(INITRD)
-mkdir $(INITRD_MOUNT) -mkdir $(INITRD_MOUNT)
# mount -t ext2 -o loop $(INITRD) $(INITRD_MOUNT) mount -t ext2 -o loop $(INITRD) $(INITRD_MOUNT)
# mkdir $(INITRD_MOUNT)/bin mkdir $(INITRD_MOUNT)/txt
# umount $(INITRD_MOUNT) cp Makefile $(INITRD_MOUNT)/txt
umount $(INITRD_MOUNT)
rm -rf $(INITRD_MOUNT) rm -rf $(INITRD_MOUNT)

View File

@ -9,6 +9,7 @@
#include "ext2.h" #include "ext2.h"
#include "mm/vmm.h" #include "mm/vmm.h"
#include "fs/vfs.h" #include "fs/vfs.h"
#include "lang/asmfuncs.h"
/* Turning an inode number into a (group, inode_index) pair: /* Turning an inode number into a (group, inode_index) pair:
* group = (inode - 1) / s_inodes_per_group * group = (inode - 1) / s_inodes_per_group
@ -22,6 +23,7 @@ int ext2_init(int fsID)
if (( fs = New(vfs_fs_t) )) if (( fs = New(vfs_fs_t) ))
{ {
fs->mount_super = ext2_mount_super; fs->mount_super = ext2_mount_super;
fs->umount_super = ext2_umount_super;
fs->mkfs = ext2_mkfs; fs->mkfs = ext2_mkfs;
vfs_register_fs(fsID, fs); vfs_register_fs(fsID, fs);
return 0; return 0;
@ -46,7 +48,101 @@ void *ext2_mount_super(major_t major, minor_t minor)
kfree(super); kfree(super);
return NULL; return NULL;
} }
return super; return super;
} }
void ext2_dump_root(vfs_mount_t *mount)
{
ext2_inode_t inode_root = ext2_get_inode(mount, 2);
kprintf("root dir i_mode: 0x%x, i_size: %d, i_links_count: %d, i_blocks: %d, i_uid: %d, i_gid: %d, i_flags: 0x%x\n", inode_root.i_mode, inode_root.i_size, inode_root.i_links_count, inode_root.i_blocks, inode_root.i_uid, inode_root.i_gid, inode_root.i_flags);
ext2_super_block_t *super = mount->super;
kprintf("s_def_resuid: %d, s_def_resgid: %d\n", super->s_def_resuid, super->s_def_resgid);
}
int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat)
{
if (file[0] != '/')
return -1;
char *fil = kmalloc(strlen(file) + 1);
strcpy(fil, file);
// TODO: stat the file :)
kfree(fil);
return 0;
}
ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number)
{
ext2_inode_t inode = ext2_get_inode(mount, inode_number);
ext2_open_inode_t *open_inode = New(ext2_open_inode_t);
open_inode->inode = inode;
open_inode->block = 0;
open_inode->block_pointers = NULL;
open_inode->block_pointers_start = 0;
return open_inode;
}
int ext2_read_inode_block(vfs_mount_t *mount, ext2_open_inode_t *open_inode, void *block)
{
ext2_super_block_t *super = mount->super;
// TODO: get the block number, read it to block
}
// block_index is a relative block number - the block number of the file
// this needs to be transformed into an absolute block number for the entire disk
u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode, u32_t block_index)
{
// TODO: convert block_index to block number using open_inode fields
return 0;
}
int ext2_close_inode(vfs_mount_t *mount, ext2_open_inode_t *open_inode)
{
if (open_inode->block_pointers)
kfree(open_inode->block_pointers);
kfree(open_inode);
return 0;
}
inline u32_t ext2_diskToFSBlock(u32_t block, ext2_super_block_t *super)
{
// convert # of disk blocks to # of filesystem blocks
return block >> (super->s_log_block_size + 1);
}
inline u32_t ext2_FSToDiskBlock(u32_t block, ext2_super_block_t *super)
{
// convert # of filesystem blocks to # of disk blocks
return block << (super->s_log_block_size + 1);
}
ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode)
{
ext2_super_block_t *super = mount->super;
inode--; // turn inode into a 0-based index
u32_t group = inode / super->s_inodes_per_group;
u32_t index = inode % super->s_inodes_per_group;
u32_t inodeAddr = (ext2_get_group_desc(mount, group).bg_inode_table <<
(10 + super->s_log_block_size)) + (index << 7);
void *block = kmalloc(512);
block_read(mount->major, mount->minor, inodeAddr >> 9, 1, block);
ext2_inode_t in = *(ext2_inode_t *)(block + (inodeAddr & 0x1FF));
kfree(block);
return in;
}
ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group)
{
ext2_super_block_t *super = mount->super;
u32_t groupDescAddr = ((1 + super->s_first_data_block) << (10 + super->s_log_block_size)) + (group << 5);
void *block = kmalloc(512);
block_read(mount->major, mount->minor, groupDescAddr >> 9, 1, block);
ext2_group_desc_t gd = *(ext2_group_desc_t *)(block + (groupDescAddr & 0x1FF));
kfree(block);
return gd;
}
int ext2_umount_super(vfs_mount_t *mount)
{
return kfree(mount->super);
}

View File

@ -8,6 +8,7 @@
#include "hos_defines.h" #include "hos_defines.h"
#include "fs/devices.h" #include "fs/devices.h"
#include "fs/vfs.h"
#define EXT2_MAGIC 0xEF53 #define EXT2_MAGIC 0xEF53
#define EXT2_NAME_LEN 255 #define EXT2_NAME_LEN 255
@ -67,7 +68,7 @@ typedef struct
u32_t s_free_blocks_count; /* Free blocks count */ u32_t s_free_blocks_count; /* Free blocks count */
u32_t s_free_inodes_count; /* Free inodes count */ u32_t s_free_inodes_count; /* Free inodes count */
u32_t s_first_data_block; /* First Data Block */ u32_t s_first_data_block; /* First Data Block */
u32_t s_log_block_size; /* Block size: 0->1024, 1->2048, 4->4096 */ u32_t s_log_block_size; /* Block size: 0->1024, 1->2048, 2->4096 */
int s_log_frag_size; /* Fragment size */ int s_log_frag_size; /* Fragment size */
u32_t s_blocks_per_group; /* # Blocks per group */ u32_t s_blocks_per_group; /* # Blocks per group */
u32_t s_frags_per_group; /* # Fragments per group */ u32_t s_frags_per_group; /* # Fragments per group */
@ -136,10 +137,28 @@ typedef struct
char name[EXT2_NAME_LEN]; char name[EXT2_NAME_LEN];
} ext2_dir_entry_t; } ext2_dir_entry_t;
typedef struct
{
ext2_inode_t inode;
u32_t block;
u32_t *block_pointers;
u32_t block_pointers_start;
} ext2_open_inode_t;
int ext2_init(int fsID); int ext2_init(int fsID);
void *ext2_mount_super(major_t major, minor_t minor); void *ext2_mount_super(major_t major, minor_t minor);
int ext2_umount_super(vfs_mount_t *mount);
int ext2_mkfs(major_t major, minor_t minor); int ext2_mkfs(major_t major, minor_t minor);
ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode);
ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group);
inline u32_t ext2_diskToFSBlock(u32_t block, ext2_super_block_t *super);
inline u32_t ext2_FSToDiskBlock(u32_t block, ext2_super_block_t *super);
int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat);
ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number);
int ext2_close_inode(vfs_mount_t *mount, ext2_open_inode_t *open_inode);
int ext2_read_inode_block(vfs_mount_t *mount, ext2_open_inode_t *open_inode, void *block_index);
void ext2_dump_root(vfs_mount_t *mount);
#endif #endif

View File

@ -54,6 +54,7 @@ int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint)
if (!mnt) if (!mnt)
return -3; // could not allocate memory return -3; // could not allocate memory
mnt->refs = 0; mnt->refs = 0;
mnt->fs = fsType;
mnt->major = maj; mnt->major = maj;
mnt->minor = min; mnt->minor = min;
mnt->super = super; mnt->super = super;
@ -186,6 +187,11 @@ int vfs_umount(char *mountPoint)
// is there something mounted underneath this directory? // is there something mounted underneath this directory?
if (node->down) if (node->down)
return -3; // yes, don't umount return -3; // yes, don't umount
if (!node->mount)
return -4; // no mount here
if (node->mount->refs)
return -5; // still refs open to mount
fses[node->mount->fs]->umount_super(node->mount);
kfree(node->mount); kfree(node->mount);
node->mount = NULL; node->mount = NULL;
return vfs_retire_node(node); return vfs_retire_node(node);

View File

@ -12,12 +12,22 @@
#define FS_EXT2 1 #define FS_EXT2 1
#define VFS_MAX_FS 10 #define VFS_MAX_FS 10
#define VFS_FT_UNKNOWN 0
#define VFS_FT_FILE 1
#define VFS_FT_DIR 2
#define VFS_FT_CHAR 3
#define VFS_FT_BLOCK 4
#define VFS_FT_FIFO 5
#define VFS_FT_SOCK 6
#define VFS_FT_SYMLINK 7
/* Structure to hold information about a mount point */ /* Structure to hold information about a mount point */
typedef struct typedef struct
{ {
int refs; int refs;
void *super; void *super;
int fs;
major_t major; major_t major;
minor_t minor; minor_t minor;
} vfs_mount_t; } vfs_mount_t;
@ -26,6 +36,7 @@ typedef struct
typedef struct typedef struct
{ {
void *(*mount_super)(major_t major, minor_t minor); void *(*mount_super)(major_t major, minor_t minor);
int (*umount_super)(vfs_mount_t *mount);
int (*mkfs)(major_t major, minor_t minor); int (*mkfs)(major_t major, minor_t minor);
} vfs_fs_t; } vfs_fs_t;
@ -51,6 +62,20 @@ typedef struct
int length; int length;
} vfs_mount_match_t; } vfs_mount_match_t;
typedef struct
{
u16_t type; // file type, of VFS_FILE_TYPE_*
u32_t size;
u32_t inode;
u16_t permissions;
u16_t uid;
u16_t gid;
u32_t atime;
u32_t mtime;
u32_t ctime;
u16_t links;
} vfs_stat_t;
int vfs_init(); int vfs_init();
int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint); int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint);