Changeset 3711e7e in mainline for uspace/lib/ext4
- Timestamp:
- 2011-10-05T09:35:12Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3712434
- Parents:
- cfa1a8a
- Location:
- uspace/lib/ext4
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_block_group.c
rcfa1a8a r3711e7e 36 36 */ 37 37 38 #include "libext4_block_group.h" 38 #include <byteorder.h> 39 #include "libext4.h" 39 40 41 uint64_t ext4_block_group_get_inode_table_first_block(ext4_block_group_t *bg) 42 { 43 return ((uint64_t)uint32_t_le2host(bg->inode_table_first_hi) << 32) | 44 uint32_t_le2host(bg->inode_table_first_lo); 45 } 40 46 41 47 /** -
uspace/lib/ext4/libext4_block_group.h
rcfa1a8a r3711e7e 34 34 #define LIBEXT4_LIBEXT4_BLOCK_GROUP_H_ 35 35 36 #include <libblock.h> 36 37 #include <sys/types.h> 37 38 #include "libext4_block_group.h" 38 39 /* 39 40 * Structure of a blocks group descriptor … … 42 43 uint32_t block_bitmap_lo; // Blocks bitmap block 43 44 uint32_t inode_bitmap_lo; // Inodes bitmap block 44 uint32_t inode_table_ lo; // Inodes table block45 uint32_t inode_table_first_lo; // Inodes table block 45 46 uint16_t free_blocks_count_lo; // Free blocks count 46 47 uint16_t free_inodes_count_lo; // Free inodes count … … 52 53 uint32_t block_bitmap_hi; // Blocks bitmap block MSB 53 54 uint32_t inode_bitmap_hi; // Inodes bitmap block MSB 54 uint32_t inode_table_ hi; // Inodes table block MSB55 uint32_t inode_table_first_hi; // Inodes table block MSB 55 56 uint16_t free_blocks_count_hi; // Free blocks count MSB 56 57 uint16_t free_inodes_count_hi; // Free inodes count MSB … … 58 59 uint16_t itable_unused_hi; // Unused inodes count MSB 59 60 uint32_t reserved2[3]; // Padding 60 } ext4_group_desc_t; 61 } ext4_block_group_t; 62 63 typedef struct ext4_block_group_ref { 64 block_t *block; // Reference to a block containing this block group descr 65 ext4_block_group_t *block_group; 66 } ext4_block_group_ref_t; 67 68 // TODO check value 69 #define EXT4_BLOCK_GROUP_DESCRIPTOR_SIZE 32 70 71 extern uint64_t ext4_block_group_get_inode_table_first_block(ext4_block_group_t *); 61 72 62 73 #endif -
uspace/lib/ext4/libext4_directory.c
rcfa1a8a r3711e7e 36 36 */ 37 37 38 #include "libext4 _directory.h"38 #include "libext4.h" 39 39 40 40 -
uspace/lib/ext4/libext4_filesystem.c
rcfa1a8a r3711e7e 38 38 #include <errno.h> 39 39 #include <malloc.h> 40 #include "libext4 _filesystem.h"40 #include "libext4.h" 41 41 42 42 /** … … 83 83 84 84 return EOK; 85 } 86 87 /** 88 * TODO doxy 89 */ 90 void ext4_filesystem_fini(ext4_filesystem_t *fs) 91 { 92 free(fs->superblock); 93 block_fini(fs->device); 85 94 } 86 95 … … 132 141 * TODO doxy 133 142 */ 134 void ext4_filesystem_fini(ext4_filesystem_t *fs) 135 { 136 free(fs->superblock); 137 block_fini(fs->device); 138 } 139 143 int ext4_filesystem_get_block_group_ref(ext4_filesystem_t *fs, uint32_t bgid, 144 ext4_block_group_ref_t **ref) 145 { 146 int rc; 147 aoff64_t block_id; 148 uint32_t descriptors_per_block; 149 size_t offset; 150 ext4_block_group_ref_t *newref; 151 152 newref = malloc(sizeof(ext4_block_group_ref_t)); 153 if (newref == NULL) { 154 return ENOMEM; 155 } 156 157 descriptors_per_block = ext4_superblock_get_block_size(fs->superblock) 158 / EXT4_BLOCK_GROUP_DESCRIPTOR_SIZE; 159 160 /* Block group descriptor table starts at the next block after superblock */ 161 block_id = ext4_superblock_get_first_block(fs->superblock) + 1; 162 163 /* Find the block containing the descriptor we are looking for */ 164 block_id += bgid / descriptors_per_block; 165 offset = (bgid % descriptors_per_block) * EXT4_BLOCK_GROUP_DESCRIPTOR_SIZE; 166 167 rc = block_get(&newref->block, fs->device, block_id, 0); 168 if (rc != EOK) { 169 free(newref); 170 return rc; 171 } 172 173 newref->block_group = newref->block->data + offset; 174 175 *ref = newref; 176 177 return EOK; 178 } 179 180 /** 181 * TODO doxy 182 */ 183 int ext4_filesystem_get_inode_ref(ext4_filesystem_t *fs, uint32_t index, 184 ext4_inode_ref_t **ref) 185 { 186 int rc; 187 aoff64_t block_id; 188 uint32_t block_group; 189 uint32_t offset_in_group; 190 uint32_t byte_offset_in_group; 191 size_t offset_in_block; 192 uint32_t inodes_per_group; 193 uint32_t inode_table_start; 194 uint16_t inode_size; 195 uint32_t block_size; 196 ext4_block_group_ref_t *bg_ref; 197 ext4_inode_ref_t *newref; 198 199 newref = malloc(sizeof(ext4_inode_ref_t)); 200 if (newref == NULL) { 201 return ENOMEM; 202 } 203 204 inodes_per_group = ext4_superblock_get_inodes_per_group(fs->superblock); 205 206 /* inode numbers are 1-based, but it is simpler to work with 0-based 207 * when computing indices 208 */ 209 index -= 1; 210 block_group = index / inodes_per_group; 211 offset_in_group = index % inodes_per_group; 212 213 rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref); 214 if (rc != EOK) { 215 free(newref); 216 return rc; 217 } 218 219 inode_table_start = ext4_block_group_get_inode_table_first_block( 220 bg_ref->block_group); 221 222 inode_size = ext4_superblock_get_inode_size(fs->superblock); 223 block_size = ext4_superblock_get_block_size(fs->superblock); 224 225 byte_offset_in_group = offset_in_group * inode_size; 226 227 block_id = inode_table_start + (byte_offset_in_group / block_size); 228 offset_in_block = byte_offset_in_group % block_size; 229 230 rc = block_get(&newref->block, fs->device, block_id, 0); 231 if (rc != EOK) { 232 free(newref); 233 return rc; 234 } 235 236 newref->inode = newref->block->data + offset_in_block; 237 /* we decremented index above, but need to store the original value 238 * in the reference 239 */ 240 newref->index = index+1; 241 242 *ref = newref; 243 244 return EOK; 245 } 140 246 141 247 /** -
uspace/lib/ext4/libext4_filesystem.h
rcfa1a8a r3711e7e 35 35 36 36 #include <libblock.h> 37 #include "libext4_block_group.h" 38 #include "libext4_inode.h" 37 39 #include "libext4_superblock.h" 38 40 … … 42 44 } ext4_filesystem_t; 43 45 44 #define EXT4_MAX_BLOCK_SIZE 65536 //64 KiB45 46 #define EXT4_MAX_BLOCK_SIZE 65536 //64 KiB 47 #define EXT4_REV0_INODE_SIZE 128 46 48 47 49 /* Compatible features */ … … 99 101 100 102 extern int ext4_filesystem_init(ext4_filesystem_t *, service_id_t); 103 extern void ext4_filesystem_fini(ext4_filesystem_t *fs); 101 104 extern int ext4_filesystem_check_sanity(ext4_filesystem_t *fs); 102 105 extern int ext4_filesystem_check_features(ext4_filesystem_t *, bool *); 103 extern void ext4_filesystem_fini(ext4_filesystem_t *fs); 106 extern int ext4_filesystem_get_block_group_ref(ext4_filesystem_t *, uint32_t, 107 ext4_block_group_ref_t **); 108 extern int ext4_filesystem_get_inode_ref(ext4_filesystem_t *, uint32_t, 109 ext4_inode_ref_t **); 110 104 111 105 112 #endif -
uspace/lib/ext4/libext4_inode.c
rcfa1a8a r3711e7e 37 37 38 38 #include <byteorder.h> 39 #include "libext4 _inode.h"39 #include "libext4.h" 40 40 41 41 // TODO check return type -
uspace/lib/ext4/libext4_superblock.c
rcfa1a8a r3711e7e 40 40 #include <libblock.h> 41 41 #include <malloc.h> 42 #include "libext4 _superblock.h"42 #include "libext4.h" 43 43 44 44 /** … … 80 80 { 81 81 return uint32_t_le2host(sb->rev_level); 82 } 83 84 /** 85 * TODO doxy 86 */ 87 uint16_t ext4_superblock_get_inode_size(ext4_superblock_t *sb) 88 { 89 if (ext4_superblock_get_rev_level(sb) == 0) { 90 return EXT4_REV0_INODE_SIZE; 91 } 92 return uint16_t_le2host(sb->inode_size); 93 } 94 95 /** 96 * TODO doxy 97 */ 98 uint32_t ext4_superblock_get_inodes_per_group(ext4_superblock_t *sb) 99 { 100 return uint32_t_le2host(sb->inodes_per_group); 82 101 } 83 102 -
uspace/lib/ext4/libext4_superblock.h
rcfa1a8a r3711e7e 51 51 uint32_t s_blocks_per_group; // Number of blocks per group 52 52 uint32_t s_obso_frags_per_group; // Obsoleted fragments per group 53 uint32_t s_inodes_per_group; // Number of inodes per group53 uint32_t inodes_per_group; // Number of inodes per group 54 54 uint32_t s_mtime; // Mount time 55 55 uint32_t s_wtime; // Write time … … 69 69 // Fields for EXT4_DYNAMIC_REV superblocks only. 70 70 uint32_t s_first_ino; // First non-reserved inode 71 uint16_t s_inode_size; // Size of inode structure71 uint16_t inode_size; // Size of inode structure 72 72 uint16_t s_block_group_nr; // Block group number of this superblock 73 73 uint32_t features_compatible; // Compatible feature set … … 147 147 extern uint32_t ext4_superblock_get_block_size(ext4_superblock_t *); 148 148 extern uint32_t ext4_superblock_get_rev_level(ext4_superblock_t *); 149 extern uint16_t ext4_superblock_get_inode_size(ext4_superblock_t *); 150 extern uint32_t ext4_superblock_get_inodes_per_group(ext4_superblock_t *); 149 151 extern uint32_t ext4_superblock_get_features_compatible(ext4_superblock_t *); 150 152 extern uint32_t ext4_superblock_get_features_incompatible(ext4_superblock_t *);
Note:
See TracChangeset
for help on using the changeset viewer.