#ifndef _KERNEL_FS_VFS_H #define _KERNEL_FS_VFS_H #include #include #include #include #include #include #include #include #include #include #include #include #include #define VFS_KERNEL ((struct proc*)0x123) #define VFS_TARFS 0 #define VFS_FAT16 1 #define VFS_FAT32 2 struct vfs_volume; struct vfs_volume { char key[VOLUME_MAX]; struct hash_node_link volume_table_link; int fs_type; spin_lock_t lock; struct proc* owner; bool locked; struct proc_suspension_q sq; struct { int (*mount) (struct vfs_volume* volume, bool format); int (*format) (struct vfs_volume* volume); int (*describe) (struct vfs_volume* volume, const char* path, struct desc* desc); int (*read_file) (struct vfs_volume* volume, const char* path, uint8_t* buffer, size_t off, size_t size); int (*write_file) (struct vfs_volume* volume, const char* path, uint8_t* buffer, size_t off, size_t size); int (*read_dir_entry) (struct vfs_volume* volume, const char* path, struct dir_entry* entry, size_t entry_num); int (*create_file) (struct vfs_volume* volume, const char* path); } driver_ops; struct device* back_device; void* udata }; struct vfs_volume_table { struct hash_node_link* volume_buckets[1024]; spin_lock_t lock; }; int vfs_create_volume (const char* key, int fs_type, struct device* back_device, bool format); int vfs_volume_open (struct proc* proc, const char* volume, struct reschedule_ctx* rctx); int vfs_volume_close (struct proc* proc, const char* volume, struct reschedule_ctx* rctx); int vfs_format (struct proc* proc, const char* volume_name); int vfs_read_file (struct proc* proc, const char* volume, const char* path, uint8_t* buffer, size_t off, size_t size); int vfs_describe (struct proc* proc, const char* volume, const char* path, struct desc* desc); int vfs_read_dir_entry (struct proc* proc, const char* volume, const char* path, struct dir_entry* entry, size_t entry_num); int vfs_create_file (struct proc* proc, const char* volume_name, const char* path); void vfs_init (void); void vfs_translate (size_t fs_block, size_t fs_block_count, size_t fs_block_size, size_t device_sector_size, size_t* out_phys_sector, size_t* out_sector_count); #endif // _KERNEL_FS_VFS_H