Import backup from 2005-05-12
This commit is contained in:
1 parent
14792ef954
commit
b0132c866e
35 files changed
+1637
-872
No files matched your search
@@ -1,18 +0,0 @@
|
||||
// devfs.c
|
||||
// Author: Josh Holtrop
|
||||
// Date: 08/22/04
|
||||
// Modified: 08/22/04
|
||||
|
||||
#include "hos_defines.h"
|
||||
#include "fs/devfs.h"
|
||||
#include "fs/devices.h"
|
||||
#include "fs/vfs.h"
|
||||
#include "block/ramdisk.h"
|
||||
|
||||
int devfs_init()
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
// devfs.h
|
||||
// Author: Josh Holtrop
|
||||
// Date: 08/22/04
|
||||
// Modified: 08/22/04
|
||||
|
||||
#ifndef __HOS_DEVFS_H__
|
||||
#define __HOS_DEVFS_H__ __HOS_DEVFS_H__
|
||||
|
||||
#include "hos_defines.h"
|
||||
#include "fs/devices.h"
|
||||
|
||||
int devfs_init();
|
||||
|
||||
#endif
|
||||
|
||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,6 @@
|
||||
// ext2.cpp
|
||||
// ext2 filesystem driver for HOS
|
||||
// Author: Josh Holtrop
|
||||
// Date: 05/10/05
|
||||
// Modified: 05/10/05
|
||||
|
||||
+9
-229
@@ -1,241 +1,21 @@
|
||||
// ext2.h
|
||||
// ext2 filesystem driver for HOS
|
||||
// Author: Josh Holtrop
|
||||
// Date: 08/22/04
|
||||
// Modified: 12/24/04
|
||||
// Date: 05/10/05
|
||||
// Modified: 05/10/05
|
||||
|
||||
#ifndef __HOS_EXT2_H__
|
||||
#define __HOS_EXT2_H__ __HOS_EXT2_H__
|
||||
|
||||
#include "hos_defines.h"
|
||||
#include "fs/devices.h"
|
||||
#include "fs/vfs.h"
|
||||
#include "vfs.h"
|
||||
|
||||
#define EXT2_MAGIC 0xEF53
|
||||
#define EXT2_NAME_LEN 255
|
||||
#ifdef _HOS_CPP_
|
||||
|
||||
#define EXT2_I_MODE_ATTR_MASK 0x0FFF
|
||||
#define EXT2_I_MODE_OX 0x0001
|
||||
#define EXT2_I_MODE_OW 0x0002
|
||||
#define EXT2_I_MODE_OR 0x0004
|
||||
#define EXT2_I_MODE_GX 0x0008
|
||||
#define EXT2_I_MODE_GW 0x0010
|
||||
#define EXT2_I_MODE_GR 0x0020
|
||||
#define EXT2_I_MODE_UX 0x0040
|
||||
#define EXT2_I_MODE_UW 0x0080
|
||||
#define EXT2_I_MODE_UR 0x0100
|
||||
#define EXT2_I_MODE_STICKY 0x0200
|
||||
#define EXT2_I_MODE_SGID 0x0400
|
||||
#define EXT2_I_MODE_SUID 0x0800
|
||||
|
||||
#define EXT2_I_MODE_TYPE_MASK 0xF000
|
||||
#define EXT2_I_MODE_FIFO 0x1000
|
||||
#define EXT2_I_MODE_CHAR 0x2000
|
||||
#define EXT2_I_MODE_DIR 0x4000
|
||||
#define EXT2_I_MODE_BLOCK 0x6000
|
||||
#define EXT2_I_MODE_FILE 0x8000
|
||||
#define EXT2_I_MODE_SYM 0xA000
|
||||
#define EXT2_I_MODE_SOCK 0xC000
|
||||
|
||||
#define EXT2_I_FLAGS_SEC_DEL 0x01
|
||||
#define EXT2_I_FLAGS_UNDELETE 0x02
|
||||
#define EXT2_I_FLAGS_COMPRESS 0x04
|
||||
#define EXT2_I_FLAGS_SYNC 0x08
|
||||
#define EXT2_I_FLAGS_IMMUTABLE 0x10
|
||||
#define EXT2_I_FLAGS_APPEND 0x20
|
||||
#define EXT2_I_FLAGS_NODUMP 0x40
|
||||
|
||||
#define EXT2_INODE_BAD_BLOCKS 1
|
||||
#define EXT2_INODE_ROOT 2
|
||||
#define EXT2_INODE_ACL_INDEX 3
|
||||
#define EXT2_INODE_ACL_DATA 4
|
||||
#define EXT2_INODE_BOOT_LOADER 5
|
||||
#define EXT2_INODE_UNDELETE_DIR 6
|
||||
#define EXT2_INODE_AVAIL 11
|
||||
|
||||
#define EXT2_FT_UNKNOWN 0
|
||||
#define EXT2_FT_FILE 1
|
||||
#define EXT2_FT_DIR 2
|
||||
#define EXT2_FT_CHAR 3
|
||||
#define EXT2_FT_BLOCK 4
|
||||
#define EXT2_FT_FIFO 5
|
||||
#define EXT2_FT_SOCK 6
|
||||
#define EXT2_FT_SYMLINK 7
|
||||
#define EXT2_FT_MAX 8
|
||||
|
||||
typedef struct
|
||||
class Ext2 : public FileSystem
|
||||
{
|
||||
u32_t s_inodes_count; /* Inodes count */
|
||||
u32_t s_blocks_count; /* Blocks count */
|
||||
u32_t s_r_blocks_count; /* Reserved blocks count */
|
||||
u32_t s_free_blocks_count; /* Free blocks count */
|
||||
u32_t s_free_inodes_count; /* Free inodes count */
|
||||
u32_t s_first_data_block; /* First Data Block */
|
||||
u32_t s_log_block_size; /* Block size: 0->1024, 1->2048, 2->4096 */
|
||||
int s_log_frag_size; /* Fragment size */
|
||||
u32_t s_blocks_per_group; /* # Blocks per group */
|
||||
u32_t s_frags_per_group; /* # Fragments per group */
|
||||
u32_t s_inodes_per_group; /* # Inodes per group */
|
||||
u32_t s_mtime; /* Mount time */
|
||||
u32_t s_wtime; /* Write time */
|
||||
u16_t s_mnt_count; /* Mount count */
|
||||
short s_max_mnt_count; /* Maximal mount count */
|
||||
u16_t s_magic; /* Magic signature */
|
||||
u16_t s_state; /* File system state */
|
||||
u16_t s_errors; /* Behaviour when detecting errors */
|
||||
u16_t s_minor_rev_level; /* minor revision level */
|
||||
u32_t s_lastcheck; /* time of last check */
|
||||
u32_t s_checkinterval; /* max. time between checks */
|
||||
u32_t s_creator_os; /* OS */
|
||||
u32_t s_rev_level; /* Revision level */
|
||||
u16_t s_def_resuid; /* Default uid for reserved blocks */
|
||||
u16_t s_def_resgid; /* Default gid for reserved blocks */
|
||||
|
||||
u32_t s_reserved[235];
|
||||
} ext2_super_block_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32_t bg_block_bitmap; // Blocks bitmap block
|
||||
u32_t bg_inode_bitmap; // Inode bitmap block
|
||||
u32_t bg_inode_table; // Inode table block
|
||||
u16_t bg_free_blocks_count; // Free blocks count
|
||||
u16_t bg_free_inodes_count; // Free Inodes count
|
||||
u16_t bg_used_dirs_count; // Directories count
|
||||
u16_t bg_pad1;
|
||||
u32_t bg_reserved[3];
|
||||
} ext2_group_desc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16_t i_mode; // File mode
|
||||
u16_t i_uid; // Owner UID
|
||||
u32_t i_size; // Size in bytes
|
||||
u32_t i_atime; // Access time
|
||||
u32_t i_ctime; // Creation time
|
||||
u32_t i_mtime; // Modification time
|
||||
u32_t i_dtime; // Deletion time
|
||||
u16_t i_gid; // Group ID
|
||||
u16_t i_links_count; // Links count
|
||||
u32_t i_blocks; // Blocks count
|
||||
u32_t i_flags; // File flags
|
||||
u32_t i_reserved1;
|
||||
u32_t i_block[15]; // Pointers to blocks (12 direct, single, double, triple indirect)
|
||||
u32_t i_version; // File version (for NFS)
|
||||
u32_t i_file_acl; // File ACL
|
||||
u32_t i_dir_acl; // Directory ACL
|
||||
u32_t i_faddr; // Fragment address
|
||||
u8_t i_frag; // Fragment number
|
||||
u8_t i_fsize; // Fragment size
|
||||
u16_t i_pad1;
|
||||
u32_t i_reserved2[2];
|
||||
} ext2_inode_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32_t inode; // inode number
|
||||
u16_t length; // directory entry length
|
||||
u8_t name_length; // name length
|
||||
u8_t file_type; // File type
|
||||
char name[EXT2_NAME_LEN];
|
||||
} 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;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ext2_open_inode_t *open_inode;
|
||||
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
|
||||
return block >> (super->s_log_block_size + 1);
|
||||
}
|
||||
|
||||
static 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);
|
||||
}
|
||||
|
||||
|
||||
int ext2_init(int fsID);
|
||||
int ext2_read_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat);
|
||||
int ext2_write_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat);
|
||||
ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group);
|
||||
void ext2_write_group_desc(vfs_mount_t *mount, u32_t group_num, ext2_group_desc_t *gd);
|
||||
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);
|
||||
u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode);
|
||||
int ext2_inode_seek(vfs_mount_t *mount, ext2_open_inode_t *open_inode, u32_t block_number);
|
||||
|
||||
int ext2_inode_status(vfs_mount_t *mount, u32_t inode_number);
|
||||
int ext2_block_status(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
u32_t ext2_alloc_inode(vfs_mount_t *mount);
|
||||
int ext2_free_inode(vfs_mount_t *mount, u32_t inode_number);
|
||||
u32_t ext2_alloc_block(vfs_mount_t *mount);
|
||||
int ext2_free_block(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
u32_t ext2_reserve_node(vfs_mount_t *mount, u32_t bitmap_block_num, u32_t bitmap_size);
|
||||
int ext2_free_node(vfs_mount_t *mount, u32_t bitmap_block_num, u32_t node_number);
|
||||
int ext2_num_block_groups(ext2_super_block_t *super);
|
||||
void ext2_write_super(vfs_mount_t *mount);
|
||||
|
||||
int ext2_resize_inode(vfs_mount_t *mount, u32_t inode_number, u32_t new_size);
|
||||
|
||||
ext2_open_dir_t *ext2_open_dir(vfs_mount_t *mount, u32_t inode_number);
|
||||
int ext2_dir_read_entry(vfs_mount_t *mount, ext2_open_dir_t *open_dir, ext2_dir_entry_t *dentry);
|
||||
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);
|
||||
|
||||
|
||||
void *ext2_mount_super(major_t major, minor_t minor);
|
||||
int ext2_umount_super(vfs_mount_t *mount);
|
||||
int ext2_stat(vfs_mount_t *mount, u32_t inode_number, vfs_stat_t *stat);
|
||||
u32_t ext2__get_root_dir_inode(vfs_mount_t *mount);
|
||||
int ext2__link_deref(vfs_mount_t *mount, u32_t link_inode, char *link);
|
||||
int ext2__free_inodes(vfs_mount_t *mount);
|
||||
int ext2__total_inodes(vfs_mount_t *mount);
|
||||
int ext2__free_blocks(vfs_mount_t *mount);
|
||||
int ext2__total_blocks(vfs_mount_t *mount);
|
||||
|
||||
|
||||
int ext2__open_dir(vfs_mount_t *mount, u32_t inode_number, 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, u32_t inode_number, 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, u32_t inode_number, 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__block_file_seek(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number);
|
||||
int ext2__close_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
File renamed without changes.
@@ -0,0 +1,241 @@
|
||||
// ext2.h
|
||||
// Author: Josh Holtrop
|
||||
// Date: 08/22/04
|
||||
// Modified: 12/24/04
|
||||
|
||||
#ifndef __HOS_EXT2_H__
|
||||
#define __HOS_EXT2_H__ __HOS_EXT2_H__
|
||||
|
||||
#include "hos_defines.h"
|
||||
#include "fs/devices.h"
|
||||
#include "fs/vfs.h"
|
||||
|
||||
#define EXT2_MAGIC 0xEF53
|
||||
#define EXT2_NAME_LEN 255
|
||||
|
||||
#define EXT2_I_MODE_ATTR_MASK 0x0FFF
|
||||
#define EXT2_I_MODE_OX 0x0001
|
||||
#define EXT2_I_MODE_OW 0x0002
|
||||
#define EXT2_I_MODE_OR 0x0004
|
||||
#define EXT2_I_MODE_GX 0x0008
|
||||
#define EXT2_I_MODE_GW 0x0010
|
||||
#define EXT2_I_MODE_GR 0x0020
|
||||
#define EXT2_I_MODE_UX 0x0040
|
||||
#define EXT2_I_MODE_UW 0x0080
|
||||
#define EXT2_I_MODE_UR 0x0100
|
||||
#define EXT2_I_MODE_STICKY 0x0200
|
||||
#define EXT2_I_MODE_SGID 0x0400
|
||||
#define EXT2_I_MODE_SUID 0x0800
|
||||
|
||||
#define EXT2_I_MODE_TYPE_MASK 0xF000
|
||||
#define EXT2_I_MODE_FIFO 0x1000
|
||||
#define EXT2_I_MODE_CHAR 0x2000
|
||||
#define EXT2_I_MODE_DIR 0x4000
|
||||
#define EXT2_I_MODE_BLOCK 0x6000
|
||||
#define EXT2_I_MODE_FILE 0x8000
|
||||
#define EXT2_I_MODE_SYM 0xA000
|
||||
#define EXT2_I_MODE_SOCK 0xC000
|
||||
|
||||
#define EXT2_I_FLAGS_SEC_DEL 0x01
|
||||
#define EXT2_I_FLAGS_UNDELETE 0x02
|
||||
#define EXT2_I_FLAGS_COMPRESS 0x04
|
||||
#define EXT2_I_FLAGS_SYNC 0x08
|
||||
#define EXT2_I_FLAGS_IMMUTABLE 0x10
|
||||
#define EXT2_I_FLAGS_APPEND 0x20
|
||||
#define EXT2_I_FLAGS_NODUMP 0x40
|
||||
|
||||
#define EXT2_INODE_BAD_BLOCKS 1
|
||||
#define EXT2_INODE_ROOT 2
|
||||
#define EXT2_INODE_ACL_INDEX 3
|
||||
#define EXT2_INODE_ACL_DATA 4
|
||||
#define EXT2_INODE_BOOT_LOADER 5
|
||||
#define EXT2_INODE_UNDELETE_DIR 6
|
||||
#define EXT2_INODE_AVAIL 11
|
||||
|
||||
#define EXT2_FT_UNKNOWN 0
|
||||
#define EXT2_FT_FILE 1
|
||||
#define EXT2_FT_DIR 2
|
||||
#define EXT2_FT_CHAR 3
|
||||
#define EXT2_FT_BLOCK 4
|
||||
#define EXT2_FT_FIFO 5
|
||||
#define EXT2_FT_SOCK 6
|
||||
#define EXT2_FT_SYMLINK 7
|
||||
#define EXT2_FT_MAX 8
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32_t s_inodes_count; /* Inodes count */
|
||||
u32_t s_blocks_count; /* Blocks count */
|
||||
u32_t s_r_blocks_count; /* Reserved blocks count */
|
||||
u32_t s_free_blocks_count; /* Free blocks count */
|
||||
u32_t s_free_inodes_count; /* Free inodes count */
|
||||
u32_t s_first_data_block; /* First Data Block */
|
||||
u32_t s_log_block_size; /* Block size: 0->1024, 1->2048, 2->4096 */
|
||||
int s_log_frag_size; /* Fragment size */
|
||||
u32_t s_blocks_per_group; /* # Blocks per group */
|
||||
u32_t s_frags_per_group; /* # Fragments per group */
|
||||
u32_t s_inodes_per_group; /* # Inodes per group */
|
||||
u32_t s_mtime; /* Mount time */
|
||||
u32_t s_wtime; /* Write time */
|
||||
u16_t s_mnt_count; /* Mount count */
|
||||
short s_max_mnt_count; /* Maximal mount count */
|
||||
u16_t s_magic; /* Magic signature */
|
||||
u16_t s_state; /* File system state */
|
||||
u16_t s_errors; /* Behaviour when detecting errors */
|
||||
u16_t s_minor_rev_level; /* minor revision level */
|
||||
u32_t s_lastcheck; /* time of last check */
|
||||
u32_t s_checkinterval; /* max. time between checks */
|
||||
u32_t s_creator_os; /* OS */
|
||||
u32_t s_rev_level; /* Revision level */
|
||||
u16_t s_def_resuid; /* Default uid for reserved blocks */
|
||||
u16_t s_def_resgid; /* Default gid for reserved blocks */
|
||||
|
||||
u32_t s_reserved[235];
|
||||
} ext2_super_block_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32_t bg_block_bitmap; // Blocks bitmap block
|
||||
u32_t bg_inode_bitmap; // Inode bitmap block
|
||||
u32_t bg_inode_table; // Inode table block
|
||||
u16_t bg_free_blocks_count; // Free blocks count
|
||||
u16_t bg_free_inodes_count; // Free Inodes count
|
||||
u16_t bg_used_dirs_count; // Directories count
|
||||
u16_t bg_pad1;
|
||||
u32_t bg_reserved[3];
|
||||
} ext2_group_desc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16_t i_mode; // File mode
|
||||
u16_t i_uid; // Owner UID
|
||||
u32_t i_size; // Size in bytes
|
||||
u32_t i_atime; // Access time
|
||||
u32_t i_ctime; // Creation time
|
||||
u32_t i_mtime; // Modification time
|
||||
u32_t i_dtime; // Deletion time
|
||||
u16_t i_gid; // Group ID
|
||||
u16_t i_links_count; // Links count
|
||||
u32_t i_blocks; // Blocks count
|
||||
u32_t i_flags; // File flags
|
||||
u32_t i_reserved1;
|
||||
u32_t i_block[15]; // Pointers to blocks (12 direct, single, double, triple indirect)
|
||||
u32_t i_version; // File version (for NFS)
|
||||
u32_t i_file_acl; // File ACL
|
||||
u32_t i_dir_acl; // Directory ACL
|
||||
u32_t i_faddr; // Fragment address
|
||||
u8_t i_frag; // Fragment number
|
||||
u8_t i_fsize; // Fragment size
|
||||
u16_t i_pad1;
|
||||
u32_t i_reserved2[2];
|
||||
} ext2_inode_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32_t inode; // inode number
|
||||
u16_t length; // directory entry length
|
||||
u8_t name_length; // name length
|
||||
u8_t file_type; // File type
|
||||
char name[EXT2_NAME_LEN];
|
||||
} 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;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ext2_open_inode_t *open_inode;
|
||||
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
|
||||
return block >> (super->s_log_block_size + 1);
|
||||
}
|
||||
|
||||
static 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);
|
||||
}
|
||||
|
||||
|
||||
int ext2_init(int fsID);
|
||||
int ext2_read_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat);
|
||||
int ext2_write_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat);
|
||||
ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group);
|
||||
void ext2_write_group_desc(vfs_mount_t *mount, u32_t group_num, ext2_group_desc_t *gd);
|
||||
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);
|
||||
u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode);
|
||||
int ext2_inode_seek(vfs_mount_t *mount, ext2_open_inode_t *open_inode, u32_t block_number);
|
||||
|
||||
int ext2_inode_status(vfs_mount_t *mount, u32_t inode_number);
|
||||
int ext2_block_status(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
u32_t ext2_alloc_inode(vfs_mount_t *mount);
|
||||
int ext2_free_inode(vfs_mount_t *mount, u32_t inode_number);
|
||||
u32_t ext2_alloc_block(vfs_mount_t *mount);
|
||||
int ext2_free_block(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
u32_t ext2_reserve_node(vfs_mount_t *mount, u32_t bitmap_block_num, u32_t bitmap_size);
|
||||
int ext2_free_node(vfs_mount_t *mount, u32_t bitmap_block_num, u32_t node_number);
|
||||
int ext2_num_block_groups(ext2_super_block_t *super);
|
||||
void ext2_write_super(vfs_mount_t *mount);
|
||||
|
||||
int ext2_resize_inode(vfs_mount_t *mount, u32_t inode_number, u32_t new_size);
|
||||
|
||||
ext2_open_dir_t *ext2_open_dir(vfs_mount_t *mount, u32_t inode_number);
|
||||
int ext2_dir_read_entry(vfs_mount_t *mount, ext2_open_dir_t *open_dir, ext2_dir_entry_t *dentry);
|
||||
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);
|
||||
|
||||
|
||||
void *ext2_mount_super(major_t major, minor_t minor);
|
||||
int ext2_umount_super(vfs_mount_t *mount);
|
||||
int ext2_stat(vfs_mount_t *mount, u32_t inode_number, vfs_stat_t *stat);
|
||||
u32_t ext2__get_root_dir_inode(vfs_mount_t *mount);
|
||||
int ext2__link_deref(vfs_mount_t *mount, u32_t link_inode, char *link);
|
||||
int ext2__free_inodes(vfs_mount_t *mount);
|
||||
int ext2__total_inodes(vfs_mount_t *mount);
|
||||
int ext2__free_blocks(vfs_mount_t *mount);
|
||||
int ext2__total_blocks(vfs_mount_t *mount);
|
||||
|
||||
|
||||
int ext2__open_dir(vfs_mount_t *mount, u32_t inode_number, 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, u32_t inode_number, 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, u32_t inode_number, 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__block_file_seek(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number);
|
||||
int ext2__close_block_file(vfs_mount_t *mount, vfs_open_file_t *open_file);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// vfs.cpp
|
||||
// Virtual file system subsystem for HOS
|
||||
// Author: Josh Holtrop
|
||||
// Date: 05/10/05
|
||||
// Modified: 05/10/05
|
||||
|
||||
#define _HOS_CPP_ _HOS_CPP_
|
||||
|
||||
#include "hos_defines.h"
|
||||
#include "vfs.h"
|
||||
|
||||
int vfs_init()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
+16
-155
@@ -1,168 +1,29 @@
|
||||
// vfs.h
|
||||
// Virtual file system subsystem for HOS
|
||||
// Author: Josh Holtrop
|
||||
// Date: 08/22/04
|
||||
// Modified: 12/21/04
|
||||
// Date: 05/10/05
|
||||
// Modified: 05/10/05
|
||||
|
||||
#ifndef __HOS_VFS_H__
|
||||
#define __HOS_VFS_H__ __HOS_VFS_H__
|
||||
|
||||
#include "hos_defines.h"
|
||||
#include "fs/devices.h"
|
||||
|
||||
#define FS_EXT2 1
|
||||
#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
|
||||
|
||||
#define VFS_PERMS_OX 0x0001
|
||||
#define VFS_PERMS_OW 0x0002
|
||||
#define VFS_PERMS_OR 0x0004
|
||||
#define VFS_PERMS_GX 0x0008
|
||||
#define VFS_PERMS_GW 0x0010
|
||||
#define VFS_PERMS_GR 0x0020
|
||||
#define VFS_PERMS_UX 0x0040
|
||||
#define VFS_PERMS_UW 0x0080
|
||||
#define VFS_PERMS_UR 0x0100
|
||||
#define VFS_PERMS_STICKY 0x0200
|
||||
#define VFS_PERMS_SGID 0x0400
|
||||
#define VFS_PERMS_SUID 0x0800
|
||||
|
||||
#define EOF 1000000
|
||||
|
||||
typedef u64_t vfs_inode_t;
|
||||
|
||||
/* Structure to hold information about a mount point */
|
||||
struct vfs_mount_s
|
||||
{
|
||||
int refs;
|
||||
void *super;
|
||||
int fs;
|
||||
major_t major;
|
||||
minor_t minor;
|
||||
char *mountPoint;
|
||||
vfs_inode_t vfs_mount_inode;
|
||||
vfs_inode_t vfs_up_inode;
|
||||
vfs_inode_t vfs_root_inode;
|
||||
struct vfs_mount_s *next;
|
||||
struct vfs_mount_s *prev;
|
||||
};
|
||||
typedef struct vfs_mount_s vfs_mount_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;
|
||||
u32_t dev;
|
||||
} vfs_stat_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vfs_mount_t *mount;
|
||||
void *fs_data;
|
||||
} vfs_open_file_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char name[257];
|
||||
u32_t inode_number; // relative inode number returned from fs
|
||||
} vfs_dir_entry_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vfs_mount_t *mount;
|
||||
u32_t inode;
|
||||
} vfs_file_addr_t;
|
||||
|
||||
/* Every filesystem must provide pointers to its respective functions in a structure like this */
|
||||
typedef struct
|
||||
{
|
||||
void *(*mount_super)(major_t major, minor_t minor);
|
||||
int (*umount_super)(vfs_mount_t *mount);
|
||||
int (*stat)(vfs_mount_t *mount, u32_t inode_number, vfs_stat_t *stat);
|
||||
u32_t (*get_root_inode)(vfs_mount_t *mount);
|
||||
int (*link_deref)(vfs_mount_t *mount, u32_t inode_number, char *link);
|
||||
int (*free_inodes)(vfs_mount_t *mount);
|
||||
int (*total_inodes)(vfs_mount_t *mount);
|
||||
int (*free_blocks)(vfs_mount_t *mount);
|
||||
int (*total_blocks)(vfs_mount_t *mount);
|
||||
|
||||
u32_t (*alloc_inode)(vfs_mount_t *mount);
|
||||
int (*free_inode)(vfs_mount_t *mount, u32_t inode_number);
|
||||
u32_t (*alloc_block)(vfs_mount_t *mount);
|
||||
int (*free_block)(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
int (*open_dir)(vfs_mount_t *mount, u32_t inode_number, 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, u32_t inode_number, 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, u32_t inode_number, vfs_open_file_t *open_file);
|
||||
int (*read_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer);
|
||||
int (*block_file_seek)(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number);
|
||||
int (*close_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file);
|
||||
|
||||
} vfs_fs_t;
|
||||
|
||||
#ifdef _HOS_CPP_
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int vfs_init();
|
||||
int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint);
|
||||
int vfs_umount(char *mountPoint);
|
||||
int vfs_register_fs(int fsn, vfs_fs_t *fs);
|
||||
int vfs_umount(char *mountPoint);
|
||||
vfs_inode_t vfs_get_inode_number(char *path);
|
||||
vfs_inode_t vfs_get_inode_number_rel(vfs_inode_t dir_inode, char *path);
|
||||
vfs_inode_t vfs_real_inode(vfs_inode_t vfs_inode);
|
||||
vfs_file_addr_t vfs_get_file_addr(vfs_inode_t vfs_inode);
|
||||
vfs_inode_t vfs_entry_lookup(vfs_inode_t dir_inode, char *entry);
|
||||
|
||||
int vfs_mount_count();
|
||||
vfs_mount_t *vfs_get_mount(int index);
|
||||
int vfs_free_inodes(vfs_mount_t *mount);
|
||||
int vfs_total_inodes(vfs_mount_t *mount);
|
||||
int vfs_free_blocks(vfs_mount_t *mount);
|
||||
int vfs_total_blocks(vfs_mount_t *mount);
|
||||
|
||||
/* Temporary for debugging */
|
||||
vfs_inode_t vfs_alloc_inode(vfs_mount_t *mount);
|
||||
int vfs_free_inode(vfs_mount_t *mount, u32_t inode_number);
|
||||
u32_t vfs_alloc_block(vfs_mount_t *mount);
|
||||
int vfs_free_block(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
|
||||
int vfs_link_deref(vfs_inode_t vfs_inode, char *link);
|
||||
|
||||
int vfs_stat(char *file, vfs_stat_t *stat);
|
||||
int vfs_stat_inode(vfs_inode_t vfs_inode, vfs_stat_t *stat);
|
||||
|
||||
vfs_open_file_t *vfs_open_dir(char *path);
|
||||
vfs_open_file_t *vfs_open_dir_inode(vfs_inode_t inode);
|
||||
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);
|
||||
|
||||
vfs_open_file_t *vfs_open_block_file(char *file);
|
||||
vfs_open_file_t *vfs_open_block_file_inode(vfs_inode_t vfs_inode);
|
||||
int vfs_read_block_file(vfs_open_file_t *open_file, void *buffer);
|
||||
int vfs_block_file_seek(vfs_open_file_t *open_file, u32_t block_number);
|
||||
int vfs_close_block_file(vfs_open_file_t *open_file);
|
||||
#ifdef _HOS_CPP_
|
||||
}
|
||||
|
||||
class FileSystem
|
||||
{
|
||||
public:
|
||||
FileSystem();
|
||||
~FileSystem();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
// vfs.c
|
||||
// vfs.cpp
|
||||
// Author: Josh Holtrop
|
||||
// Date: 08/22/04
|
||||
// Modified: 12/21/04
|
||||
|
||||
#define _HOS_CPP_ _HOS_CPP_
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include "hos_defines.h"
|
||||
#include "display/kout.h"
|
||||
#include "fs/vfs.h"
|
||||
@@ -10,6 +14,8 @@
|
||||
#include "kernel.h"
|
||||
#include "mm/vmm.h"
|
||||
#include "lang/lang.h"
|
||||
}
|
||||
|
||||
|
||||
vfs_fs_t *fses[VFS_MAX_FS]; // a vfs_fs structure for every filesystem we support
|
||||
vfs_mount_t *mounts;
|
||||
@@ -18,9 +24,16 @@ vfs_mount_t *mounts;
|
||||
int vfs_init()
|
||||
{
|
||||
k_check(ext2_init(FS_EXT2), "ext2_init() failed!");
|
||||
FileSystem fs;
|
||||
FileSystem *ext2 = new Ext2();
|
||||
FileSystem *jfs = new JoshsFS();
|
||||
fs.out();
|
||||
ext2->out();
|
||||
jfs->out();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// called by a filesystem driver to let us know that it is ready to handle fs requests
|
||||
int vfs_register_fs(int fsn, vfs_fs_t *fs)
|
||||
{
|
||||
@@ -45,7 +58,7 @@ int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint)
|
||||
void *super = fses[fsType]->mount_super(maj, min);
|
||||
if (!super)
|
||||
return -3; // didn't mount superblock
|
||||
vfs_mount_t *mnt = New(vfs_mount_t);
|
||||
vfs_mount_t *mnt = (vfs_mount_t *) New(vfs_mount_t);
|
||||
mnt->refs = 0;
|
||||
mnt->fs = fsType;
|
||||
mnt->major = maj;
|
||||
@@ -53,7 +66,7 @@ int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint)
|
||||
mnt->super = super;
|
||||
mnt->next = NULL;
|
||||
mnt->prev = NULL;
|
||||
mnt->mountPoint = kmalloc(2);
|
||||
mnt->mountPoint = (char *) kmalloc(2);
|
||||
strcpy(mnt->mountPoint, mountPoint);
|
||||
mnt->vfs_mount_inode = 0; // root not mounted on another fs
|
||||
mnt->vfs_root_inode = ((vfs_inode_t)maj << 40) | ((vfs_inode_t)min << 32) | fses[fsType]->get_root_inode(mnt);
|
||||
@@ -77,13 +90,13 @@ int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint)
|
||||
void *super = fses[fsType]->mount_super(maj, min);
|
||||
if (!super)
|
||||
return -3; // didn't mount superblock
|
||||
vfs_mount_t *mnt = New(vfs_mount_t);
|
||||
vfs_mount_t *mnt = (vfs_mount_t *) New(vfs_mount_t);
|
||||
mnt->refs = 0;
|
||||
mnt->super = super;
|
||||
mnt->fs = fsType;
|
||||
mnt->major = maj;
|
||||
mnt->minor = min;
|
||||
mnt->mountPoint = kmalloc(strlen(mountPoint) + 1);
|
||||
mnt->mountPoint = (char *) kmalloc(strlen(mountPoint) + 1);
|
||||
strcpy(mnt->mountPoint, mountPoint);
|
||||
mnt->vfs_mount_inode = vfs_inode;
|
||||
mnt->vfs_up_inode = updir;
|
||||
@@ -135,7 +148,7 @@ vfs_inode_t vfs_get_inode_number(char *path)
|
||||
|
||||
vfs_inode_t vfs_get_inode_number_rel(vfs_inode_t dir_inode, char *path)
|
||||
{
|
||||
char *path_copy = kmalloc(strlen(path) + 1);
|
||||
char *path_copy = (char *) kmalloc(strlen(path) + 1);
|
||||
strcpy(path_copy, path);
|
||||
int stanzas = str_split(path_copy, '/');
|
||||
char *lookup = path_copy;
|
||||
@@ -149,7 +162,7 @@ vfs_inode_t vfs_get_inode_number_rel(vfs_inode_t dir_inode, char *path)
|
||||
return 0x8000000000000002ULL;
|
||||
if (stat.type == VFS_FT_SYMLINK)
|
||||
{
|
||||
char *link = kmalloc(4096);
|
||||
char *link = (char *) kmalloc(4096);
|
||||
vfs_link_deref(vfs_inode, link);
|
||||
if (link[0] == '/')
|
||||
vfs_inode = vfs_get_inode_number(link);
|
||||
@@ -348,7 +361,7 @@ vfs_open_file_t *vfs_open_dir(char *path)
|
||||
vfs_open_file_t *vfs_open_dir_inode(vfs_inode_t vfs_inode)
|
||||
{
|
||||
vfs_file_addr_t addr = vfs_get_file_addr(vfs_inode);
|
||||
vfs_open_file_t *open_dir = New(vfs_open_file_t);
|
||||
vfs_open_file_t *open_dir = (vfs_open_file_t *) New(vfs_open_file_t);
|
||||
if (fses[addr.mount->fs]->open_dir && !(fses[addr.mount->fs]->open_dir(addr.mount, addr.inode, open_dir)))
|
||||
{
|
||||
open_dir->mount = addr.mount;
|
||||
@@ -384,7 +397,7 @@ vfs_open_file_t *vfs_open_block_file(char *path)
|
||||
vfs_open_file_t *vfs_open_block_file_inode(vfs_inode_t vfs_inode)
|
||||
{
|
||||
vfs_file_addr_t addr = vfs_get_file_addr(vfs_inode);
|
||||
vfs_open_file_t *open_file = New(vfs_open_file_t);
|
||||
vfs_open_file_t *open_file = (vfs_open_file_t *) New(vfs_open_file_t);
|
||||
if (fses[addr.mount->fs]->open_block_file && !(fses[addr.mount->fs]->open_block_file(addr.mount, addr.inode, open_file)))
|
||||
{
|
||||
open_file->mount = addr.mount;
|
||||
@@ -0,0 +1,218 @@
|
||||
// vfs.h
|
||||
// Author: Josh Holtrop
|
||||
// Date: 08/22/04
|
||||
// Modified: 12/21/04
|
||||
|
||||
#ifndef __HOS_VFS_H__
|
||||
#define __HOS_VFS_H__ __HOS_VFS_H__
|
||||
|
||||
#include "hos_defines.h"
|
||||
#include "fs/devices.h"
|
||||
|
||||
#define FS_EXT2 1
|
||||
#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
|
||||
|
||||
#define VFS_PERMS_OX 0x0001
|
||||
#define VFS_PERMS_OW 0x0002
|
||||
#define VFS_PERMS_OR 0x0004
|
||||
#define VFS_PERMS_GX 0x0008
|
||||
#define VFS_PERMS_GW 0x0010
|
||||
#define VFS_PERMS_GR 0x0020
|
||||
#define VFS_PERMS_UX 0x0040
|
||||
#define VFS_PERMS_UW 0x0080
|
||||
#define VFS_PERMS_UR 0x0100
|
||||
#define VFS_PERMS_STICKY 0x0200
|
||||
#define VFS_PERMS_SGID 0x0400
|
||||
#define VFS_PERMS_SUID 0x0800
|
||||
|
||||
#define EOF 1000000
|
||||
|
||||
typedef u64_t vfs_inode_t;
|
||||
|
||||
/* Structure to hold information about a mount point */
|
||||
struct vfs_mount_s
|
||||
{
|
||||
int refs;
|
||||
void *super;
|
||||
int fs;
|
||||
major_t major;
|
||||
minor_t minor;
|
||||
char *mountPoint;
|
||||
vfs_inode_t vfs_mount_inode;
|
||||
vfs_inode_t vfs_up_inode;
|
||||
vfs_inode_t vfs_root_inode;
|
||||
struct vfs_mount_s *next;
|
||||
struct vfs_mount_s *prev;
|
||||
};
|
||||
typedef struct vfs_mount_s vfs_mount_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;
|
||||
u32_t dev;
|
||||
} vfs_stat_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vfs_mount_t *mount;
|
||||
void *fs_data;
|
||||
} vfs_open_file_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char name[257];
|
||||
u32_t inode_number; // relative inode number returned from fs
|
||||
} vfs_dir_entry_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vfs_mount_t *mount;
|
||||
u32_t inode;
|
||||
} vfs_file_addr_t;
|
||||
|
||||
/* Every filesystem must provide pointers to its respective functions in a structure like this */
|
||||
typedef struct
|
||||
{
|
||||
void *(*mount_super)(major_t major, minor_t minor);
|
||||
int (*umount_super)(vfs_mount_t *mount);
|
||||
int (*stat)(vfs_mount_t *mount, u32_t inode_number, vfs_stat_t *stat);
|
||||
u32_t (*get_root_inode)(vfs_mount_t *mount);
|
||||
int (*link_deref)(vfs_mount_t *mount, u32_t inode_number, char *link);
|
||||
int (*free_inodes)(vfs_mount_t *mount);
|
||||
int (*total_inodes)(vfs_mount_t *mount);
|
||||
int (*free_blocks)(vfs_mount_t *mount);
|
||||
int (*total_blocks)(vfs_mount_t *mount);
|
||||
|
||||
u32_t (*alloc_inode)(vfs_mount_t *mount);
|
||||
int (*free_inode)(vfs_mount_t *mount, u32_t inode_number);
|
||||
u32_t (*alloc_block)(vfs_mount_t *mount);
|
||||
int (*free_block)(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
int (*open_dir)(vfs_mount_t *mount, u32_t inode_number, 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, u32_t inode_number, 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, u32_t inode_number, vfs_open_file_t *open_file);
|
||||
int (*read_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file, void *buffer);
|
||||
int (*block_file_seek)(vfs_mount_t *mount, vfs_open_file_t *open_file, u32_t block_number);
|
||||
int (*close_block_file)(vfs_mount_t *mount, vfs_open_file_t *open_file);
|
||||
|
||||
} vfs_fs_t;
|
||||
|
||||
|
||||
int vfs_init();
|
||||
int vfs_mount(major_t maj, minor_t min, int fsType, char *mountPoint);
|
||||
int vfs_umount(char *mountPoint);
|
||||
int vfs_register_fs(int fsn, vfs_fs_t *fs);
|
||||
int vfs_umount(char *mountPoint);
|
||||
vfs_inode_t vfs_get_inode_number(char *path);
|
||||
vfs_inode_t vfs_get_inode_number_rel(vfs_inode_t dir_inode, char *path);
|
||||
vfs_inode_t vfs_real_inode(vfs_inode_t vfs_inode);
|
||||
vfs_file_addr_t vfs_get_file_addr(vfs_inode_t vfs_inode);
|
||||
vfs_inode_t vfs_entry_lookup(vfs_inode_t dir_inode, char *entry);
|
||||
|
||||
int vfs_mount_count();
|
||||
vfs_mount_t *vfs_get_mount(int index);
|
||||
int vfs_free_inodes(vfs_mount_t *mount);
|
||||
int vfs_total_inodes(vfs_mount_t *mount);
|
||||
int vfs_free_blocks(vfs_mount_t *mount);
|
||||
int vfs_total_blocks(vfs_mount_t *mount);
|
||||
|
||||
vfs_inode_t vfs_alloc_inode(vfs_mount_t *mount);
|
||||
int vfs_free_inode(vfs_mount_t *mount, u32_t inode_number);
|
||||
u32_t vfs_alloc_block(vfs_mount_t *mount);
|
||||
int vfs_free_block(vfs_mount_t *mount, u32_t block_number);
|
||||
|
||||
|
||||
int vfs_link_deref(vfs_inode_t vfs_inode, char *link);
|
||||
|
||||
int vfs_stat(char *file, vfs_stat_t *stat);
|
||||
int vfs_stat_inode(vfs_inode_t vfs_inode, vfs_stat_t *stat);
|
||||
|
||||
vfs_open_file_t *vfs_open_dir(char *path);
|
||||
vfs_open_file_t *vfs_open_dir_inode(vfs_inode_t inode);
|
||||
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);
|
||||
|
||||
vfs_open_file_t *vfs_open_block_file(char *file);
|
||||
vfs_open_file_t *vfs_open_block_file_inode(vfs_inode_t vfs_inode);
|
||||
int vfs_read_block_file(vfs_open_file_t *open_file, void *buffer);
|
||||
int vfs_block_file_seek(vfs_open_file_t *open_file, u32_t block_number);
|
||||
int vfs_close_block_file(vfs_open_file_t *open_file);
|
||||
|
||||
#ifdef _HOS_CPP_
|
||||
|
||||
class FileSystem
|
||||
{
|
||||
public:
|
||||
FileSystem();
|
||||
virtual void out();
|
||||
};
|
||||
|
||||
FileSystem::FileSystem()
|
||||
{
|
||||
kprintf("FileSystem()\n");
|
||||
}
|
||||
void FileSystem::out()
|
||||
{
|
||||
kprintf("I am a FileSystem object.\n");
|
||||
}
|
||||
|
||||
class Ext2 : public FileSystem
|
||||
{
|
||||
public:
|
||||
Ext2();
|
||||
void out();
|
||||
};
|
||||
|
||||
Ext2::Ext2()
|
||||
{
|
||||
kprintf("Ext2()\n");
|
||||
}
|
||||
void Ext2::out()
|
||||
{
|
||||
kprintf("I am an Ext2 object.\n");
|
||||
}
|
||||
|
||||
class JoshsFS : public FileSystem
|
||||
{
|
||||
public:
|
||||
JoshsFS();
|
||||
void out();
|
||||
};
|
||||
|
||||
JoshsFS::JoshsFS()
|
||||
{
|
||||
kprintf("JoshsFS()\n");
|
||||
}
|
||||
void JoshsFS::out()
|
||||
{
|
||||
kprintf("I am an JoshsFS object.\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
Reference in new issue
Block a user