diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c index 9df2943..3fc8ae1 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -299,9 +299,37 @@ u32_t ext2_alloc_inode(vfs_mount_t *mount) ext2_super_block_t *super = mount->super; if (!super->s_free_inodes_count) return 0; // no free inodes - + int bg; + for (bg = 0; bg < super->s_blocks_count; b++) + { + ext2_group_desc_t group_desc = ext2_get_group_desc(mount, b); + if (group_desc.bg_free_inodes_count) + { + u32_t node = ext2_reserve_node(super, group_desc.bg_inode_bitmap, super->s_inodes_per_group); + return b * + } + } + return 0; } +u32_t ext2_reserve_node(ext2_super_block_t *super, u32_t bitmap_block_num, u32_t max_node) +{ + u32_t *bitmap = kmalloc(1024 << super->s_log_block_size); + int block, max_block = max_node / (8192 << super->s_log_block_size); + for (block = 0; block < max_block; block++) + { + block_read(super->major, super->minor, ext2_FSToDiskBlock(bitmap_block_num + block, super), + 2 << super->s_log_block_size, bitmap); + } + kfree(bitmap); +} + + +int ext2_num_block_groups(ext2_super_block_t *super) +{ +} + + /***************** VFS INTERFACE FUNCTIONS *******************/ diff --git a/kernel/fs/ext2.h b/kernel/fs/ext2.h index c91d9cc..1b72e4c 100644 --- a/kernel/fs/ext2.h +++ b/kernel/fs/ext2.h @@ -192,6 +192,8 @@ int ext2_inode_seek(vfs_mount_t *mount, ext2_open_inode_t *open_inode, u32_t blo 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); +u32_t ext2_reserve_node(ext2_super_block_t *super, u32_t bitmap_block_num, u32_t max_node); +int ext2_num_block_groups(ext2_super_block_t *super); ext2_open_dir_t *ext2_open_dir(vfs_mount_t *mount, u32_t inode_number);