Changeset 1ac1ab4 in mainline for uspace/lib/ext4/libext4_balloc.c
- Timestamp:
- 2012-03-31T20:00:15Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a2fa350
- Parents:
- 38384ae
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_balloc.c
r38384ae r1ac1ab4 82 82 83 83 84 int ext4_balloc_free_block(ext4_ filesystem_t *fs, ext4_inode_ref_t *inode_ref, uint32_t block_addr)84 int ext4_balloc_free_block(ext4_inode_ref_t *inode_ref, uint32_t block_addr) 85 85 { 86 86 int rc; 87 87 88 uint32_t block_group = ext4_balloc_get_bgid_of_block(fs->superblock, block_addr); 89 uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(fs->superblock, block_addr); 88 ext4_filesystem_t *fs = inode_ref->fs; 89 ext4_superblock_t *sb = fs->superblock; 90 91 uint32_t block_group = ext4_balloc_get_bgid_of_block(sb, block_addr); 92 uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(sb, block_addr); 90 93 91 94 ext4_block_group_ref_t *bg_ref; … … 97 100 98 101 uint32_t bitmap_block_addr = ext4_block_group_get_block_bitmap( 99 bg_ref->block_group, fs->superblock);102 bg_ref->block_group, sb); 100 103 block_t *bitmap_block; 101 104 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); … … 116 119 } 117 120 118 uint32_t block_size = ext4_superblock_get_block_size( fs->superblock);121 uint32_t block_size = ext4_superblock_get_block_size(sb); 119 122 120 123 // Update superblock free blocks count 121 uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count( fs->superblock);124 uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(sb); 122 125 sb_free_blocks--; 123 ext4_superblock_set_free_blocks_count( fs->superblock, sb_free_blocks);126 ext4_superblock_set_free_blocks_count(sb, sb_free_blocks); 124 127 125 128 // Update inode blocks count 126 uint64_t ino_blocks = ext4_inode_get_blocks_count( fs->superblock, inode_ref->inode);129 uint64_t ino_blocks = ext4_inode_get_blocks_count(sb, inode_ref->inode); 127 130 ino_blocks -= block_size / EXT4_INODE_BLOCK_SIZE; 128 ext4_inode_set_blocks_count( fs->superblock, inode_ref->inode, ino_blocks);131 ext4_inode_set_blocks_count(sb, inode_ref->inode, ino_blocks); 129 132 inode_ref->dirty = true; 130 133 131 134 // Update block group free blocks count 132 135 uint32_t free_blocks = ext4_block_group_get_free_blocks_count( 133 bg_ref->block_group, fs->superblock);136 bg_ref->block_group, sb); 134 137 free_blocks++; 135 138 ext4_block_group_set_free_blocks_count(bg_ref->block_group, 136 fs->superblock, free_blocks);139 sb, free_blocks); 137 140 bg_ref->dirty = true; 138 141 … … 178 181 179 182 180 static uint32_t ext4_balloc_find_goal(ext4_ filesystem_t *fs, ext4_inode_ref_t *inode_ref)183 static uint32_t ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref) 181 184 { 182 185 int rc; 183 186 uint32_t goal = 0; 184 187 185 uint64_t inode_size = ext4_inode_get_size(fs->superblock, inode_ref->inode); 186 uint32_t block_size = ext4_superblock_get_block_size(fs->superblock); 188 ext4_superblock_t *sb = inode_ref->fs->superblock; 189 190 uint64_t inode_size = ext4_inode_get_size(sb, inode_ref->inode); 191 uint32_t block_size = ext4_superblock_get_block_size(sb); 187 192 uint32_t inode_block_count = inode_size / block_size; 188 193 … … 193 198 if (inode_block_count > 0) { 194 199 // TODO check retval 195 ext4_filesystem_get_inode_data_block_index( fs,inode_ref, inode_block_count - 1, &goal);200 ext4_filesystem_get_inode_data_block_index(inode_ref, inode_block_count - 1, &goal); 196 201 197 202 // TODO … … 203 208 204 209 // Identify block group of inode 205 uint32_t inodes_per_group = ext4_superblock_get_inodes_per_group( fs->superblock);210 uint32_t inodes_per_group = ext4_superblock_get_inodes_per_group(sb); 206 211 uint32_t block_group = (inode_ref->index - 1) / inodes_per_group; 207 block_size = ext4_superblock_get_block_size( fs->superblock);212 block_size = ext4_superblock_get_block_size(sb); 208 213 209 214 ext4_block_group_ref_t *bg_ref; 210 rc = ext4_filesystem_get_block_group_ref( fs, block_group, &bg_ref);215 rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, block_group, &bg_ref); 211 216 if (rc != EOK) { 212 217 return 0; 213 218 } 214 219 215 uint32_t block_group_count = ext4_superblock_get_block_group_count( fs->superblock);220 uint32_t block_group_count = ext4_superblock_get_block_group_count(sb); 216 221 uint32_t inode_table_first_block = ext4_block_group_get_inode_table_first_block( 217 bg_ref->block_group, fs->superblock);218 uint16_t inode_table_item_size = ext4_superblock_get_inode_size( fs->superblock);222 bg_ref->block_group, sb); 223 uint16_t inode_table_item_size = ext4_superblock_get_inode_size(sb); 219 224 uint32_t inode_table_bytes; 220 225 … … 223 228 } else { 224 229 // last block group could be smaller 225 uint32_t inodes_count_total = ext4_superblock_get_inodes_count( fs->superblock);230 uint32_t inodes_count_total = ext4_superblock_get_inodes_count(sb); 226 231 inode_table_bytes = 227 232 (inodes_count_total - ((block_group_count - 1) * inodes_per_group)) … … 242 247 } 243 248 244 int ext4_balloc_alloc_block( ext4_filesystem_t *fs,249 int ext4_balloc_alloc_block( 245 250 ext4_inode_ref_t *inode_ref, uint32_t *fblock) 246 251 { … … 253 258 254 259 // Find GOAL 255 uint32_t goal = ext4_balloc_find_goal( fs,inode_ref);260 uint32_t goal = ext4_balloc_find_goal(inode_ref); 256 261 if (goal == 0) { 257 262 // TODO … … 260 265 } 261 266 267 ext4_superblock_t *sb = inode_ref->fs->superblock; 268 262 269 // Load block group number for goal and relative index 263 uint32_t block_group = ext4_balloc_get_bgid_of_block( fs->superblock, goal);264 uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group( fs->superblock, goal);270 uint32_t block_group = ext4_balloc_get_bgid_of_block(sb, goal); 271 uint32_t index_in_group = ext4_balloc_blockaddr2_index_in_group(sb, goal); 265 272 266 273 267 274 ext4_block_group_ref_t *bg_ref; 268 rc = ext4_filesystem_get_block_group_ref( fs, block_group, &bg_ref);275 rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, block_group, &bg_ref); 269 276 if (rc != EOK) { 270 277 EXT4FS_DBG("initial BG ref not loaded"); … … 273 280 274 281 uint32_t first_in_group = 275 ext4_balloc_get_first_data_block_in_group( fs->superblock,282 ext4_balloc_get_first_data_block_in_group(sb, 276 283 bg_ref->block_group, block_group); 277 284 278 285 uint32_t first_in_group_index = ext4_balloc_blockaddr2_index_in_group( 279 fs->superblock, first_in_group);286 sb, first_in_group); 280 287 281 288 if (index_in_group < first_in_group_index) { … … 285 292 // Load bitmap 286 293 bitmap_block_addr = ext4_block_group_get_block_bitmap(bg_ref->block_group, 287 fs->superblock);288 289 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);294 sb); 295 296 rc = block_get(&bitmap_block, inode_ref->fs->device, bitmap_block_addr, 0); 290 297 if (rc != EOK) { 291 298 ext4_filesystem_put_block_group_ref(bg_ref); … … 311 318 } 312 319 313 uint32_t blocks_in_group = ext4_superblock_get_blocks_in_group( fs->superblock, block_group);320 uint32_t blocks_in_group = ext4_superblock_get_blocks_in_group(sb, block_group); 314 321 315 322 uint32_t end_idx = (index_in_group + 63) & ~63; … … 331 338 332 339 allocated_block = ext4_balloc_index_in_group2blockaddr( 333 fs->superblock, tmp_idx, block_group);340 sb, tmp_idx, block_group); 334 341 335 342 goto success; … … 349 356 350 357 allocated_block = ext4_balloc_index_in_group2blockaddr( 351 fs->superblock, rel_block_idx, block_group);358 sb, rel_block_idx, block_group); 352 359 353 360 goto success; … … 365 372 366 373 allocated_block = ext4_balloc_index_in_group2blockaddr( 367 fs->superblock, rel_block_idx, block_group);374 sb, rel_block_idx, block_group); 368 375 369 376 goto success; … … 375 382 376 383 // Try other block groups 377 uint32_t block_group_count = ext4_superblock_get_block_group_count( fs->superblock);384 uint32_t block_group_count = ext4_superblock_get_block_group_count(sb); 378 385 379 386 uint32_t bgid = (block_group + 1) % block_group_count; … … 381 388 382 389 while (count > 0) { 383 rc = ext4_filesystem_get_block_group_ref( fs, bgid, &bg_ref);390 rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, bgid, &bg_ref); 384 391 if (rc != EOK) { 385 392 EXT4FS_DBG("errrrrrrrrrrr"); … … 389 396 // Load bitmap 390 397 bitmap_block_addr = ext4_block_group_get_block_bitmap( 391 bg_ref->block_group, fs->superblock);392 393 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0);398 bg_ref->block_group, sb); 399 400 rc = block_get(&bitmap_block, inode_ref->fs->device, bitmap_block_addr, 0); 394 401 if (rc != EOK) { 395 402 ext4_filesystem_put_block_group_ref(bg_ref); … … 399 406 400 407 first_in_group = ext4_balloc_get_first_data_block_in_group( 401 fs->superblock, bg_ref->block_group, bgid);402 index_in_group = ext4_balloc_blockaddr2_index_in_group( fs->superblock,408 sb, bg_ref->block_group, bgid); 409 index_in_group = ext4_balloc_blockaddr2_index_in_group(sb, 403 410 first_in_group); 404 blocks_in_group = ext4_superblock_get_blocks_in_group( fs->superblock, bgid);411 blocks_in_group = ext4_superblock_get_blocks_in_group(sb, bgid); 405 412 406 413 first_in_group_index = ext4_balloc_blockaddr2_index_in_group( 407 fs->superblock, first_in_group);414 sb, first_in_group); 408 415 409 416 if (index_in_group < first_in_group_index) { … … 422 429 423 430 allocated_block = ext4_balloc_index_in_group2blockaddr( 424 fs->superblock, rel_block_idx, bgid);431 sb, rel_block_idx, bgid); 425 432 426 433 goto success; … … 438 445 439 446 allocated_block = ext4_balloc_index_in_group2blockaddr( 440 fs->superblock, rel_block_idx, bgid);447 sb, rel_block_idx, bgid); 441 448 442 449 goto success; … … 456 463 ; // Empty command - because of syntax 457 464 458 uint32_t block_size = ext4_superblock_get_block_size( fs->superblock);465 uint32_t block_size = ext4_superblock_get_block_size(sb); 459 466 460 467 // Update superblock free blocks count 461 uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count( fs->superblock);468 uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(sb); 462 469 sb_free_blocks--; 463 ext4_superblock_set_free_blocks_count( fs->superblock, sb_free_blocks);470 ext4_superblock_set_free_blocks_count(sb, sb_free_blocks); 464 471 465 472 // Update inode blocks (different block size!) count 466 473 467 uint64_t ino_blocks = ext4_inode_get_blocks_count( fs->superblock, inode_ref->inode);474 uint64_t ino_blocks = ext4_inode_get_blocks_count(sb, inode_ref->inode); 468 475 ino_blocks += block_size / EXT4_INODE_BLOCK_SIZE; 469 ext4_inode_set_blocks_count( fs->superblock, inode_ref->inode, ino_blocks);476 ext4_inode_set_blocks_count(sb, inode_ref->inode, ino_blocks); 470 477 inode_ref->dirty = true; 471 478 472 479 // Update block group free blocks count 473 480 uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count( 474 bg_ref->block_group, fs->superblock);481 bg_ref->block_group, sb); 475 482 bg_free_blocks--; 476 ext4_block_group_set_free_blocks_count(bg_ref->block_group, 477 fs->superblock, bg_free_blocks); 483 ext4_block_group_set_free_blocks_count(bg_ref->block_group, sb, bg_free_blocks); 478 484 bg_ref->dirty = true; 479 485
Note:
See TracChangeset
for help on using the changeset viewer.