Changes in uspace/lib/ext4/libext4_balloc.c [d579acc:38542dc] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_balloc.c
rd579acc r38542dc 91 91 block_t *bitmap_block; 92 92 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 93 if (rc != EOK) { 94 ext4_filesystem_put_block_group_ref(bg_ref); 95 return rc; 96 } 93 if (rc != EOK) 94 return rc; 97 95 98 96 /* Modify bitmap */ … … 132 130 133 131 /* Release block group reference */ 134 return ext4_filesystem_put_block_group_ref(bg_ref); 132 rc = ext4_filesystem_put_block_group_ref(bg_ref); 133 if (rc != EOK) 134 return rc; 135 136 return EOK; 135 137 } 136 138 … … 171 173 block_t *bitmap_block; 172 174 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 173 if (rc != EOK) { 174 ext4_filesystem_put_block_group_ref(bg_ref); 175 return rc; 176 } 175 if (rc != EOK) 176 return rc; 177 177 178 178 /* Modify bitmap */ … … 212 212 213 213 /* Release block group reference */ 214 return ext4_filesystem_put_block_group_ref(bg_ref); 214 rc = ext4_filesystem_put_block_group_ref(bg_ref); 215 if (rc != EOK) 216 return rc; 217 218 return EOK; 215 219 } 216 220 … … 260 264 * 261 265 */ 262 static int ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref, uint32_t *goal)266 static uint32_t ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref) 263 267 { 264 *goal = 0; 268 uint32_t goal = 0; 269 265 270 ext4_superblock_t *sb = inode_ref->fs->superblock; 266 271 … … 275 280 if (inode_block_count > 0) { 276 281 int rc = ext4_filesystem_get_inode_data_block_index(inode_ref, 277 inode_block_count - 1, goal);282 inode_block_count - 1, &goal); 278 283 if (rc != EOK) 279 return rc;284 return 0; 280 285 281 286 if (goal != 0) { 282 (*goal)++;283 return EOK;287 goal++; 288 return goal; 284 289 } 285 290 … … 297 302 block_group, &bg_ref); 298 303 if (rc != EOK) 299 return rc;304 return 0; 300 305 301 306 /* Compute indexes */ … … 322 327 inode_table_blocks++; 323 328 324 *goal = inode_table_first_block + inode_table_blocks; 325 326 return ext4_filesystem_put_block_group_ref(bg_ref); 329 goal = inode_table_first_block + inode_table_blocks; 330 331 ext4_filesystem_put_block_group_ref(bg_ref); 332 333 return goal; 327 334 } 328 335 … … 342 349 block_t *bitmap_block; 343 350 uint32_t rel_block_idx = 0; 344 uint32_t free_blocks;345 uint32_t goal;346 351 347 352 /* Find GOAL */ 348 int rc = ext4_balloc_find_goal(inode_ref, &goal); 349 if (rc != EOK) 350 return rc; 351 353 uint32_t goal = ext4_balloc_find_goal(inode_ref); 354 if (goal == 0) { 355 /* no goal found => partition is full */ 356 return ENOSPC; 357 } 358 352 359 ext4_superblock_t *sb = inode_ref->fs->superblock; 353 360 … … 359 366 /* Load block group reference */ 360 367 ext4_block_group_ref_t *bg_ref; 361 rc = ext4_filesystem_get_block_group_ref(inode_ref->fs,368 int rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, 362 369 block_group, &bg_ref); 363 370 if (rc != EOK) 364 371 return rc; 365 366 free_blocks =367 ext4_block_group_get_free_blocks_count(bg_ref->block_group, sb);368 if (free_blocks == 0) {369 /* This group has no free blocks */370 goto goal_failed;371 }372 372 373 373 /* Compute indexes */ … … 467 467 468 468 /* No free block found yet */ 469 rc = block_put(bitmap_block); 470 if (rc != EOK) { 471 ext4_filesystem_put_block_group_ref(bg_ref); 472 return rc; 473 } 474 475 goal_failed: 476 477 rc = ext4_filesystem_put_block_group_ref(bg_ref); 478 if (rc != EOK) 479 return rc; 469 block_put(bitmap_block); 470 ext4_filesystem_put_block_group_ref(bg_ref); 480 471 481 472 /* Try other block groups */ … … 490 481 if (rc != EOK) 491 482 return rc; 492 493 free_blocks = 494 ext4_block_group_get_free_blocks_count(bg_ref->block_group, sb); 495 if (free_blocks == 0) { 496 /* This group has no free blocks */ 497 goto next_group; 498 } 499 483 500 484 /* Load block with bitmap */ 501 485 bitmap_block_addr = … … 528 512 bitmap_block->dirty = true; 529 513 rc = block_put(bitmap_block); 530 if (rc != EOK) { 531 ext4_filesystem_put_block_group_ref(bg_ref); 514 if (rc != EOK) 532 515 return rc; 533 }534 516 535 517 allocated_block = … … 546 528 bitmap_block->dirty = true; 547 529 rc = block_put(bitmap_block); 548 if (rc != EOK) { 549 ext4_filesystem_put_block_group_ref(bg_ref); 530 if (rc != EOK) 550 531 return rc; 551 }552 532 553 533 allocated_block = … … 558 538 } 559 539 560 rc = block_put(bitmap_block); 561 if (rc != EOK) { 562 ext4_filesystem_put_block_group_ref(bg_ref); 563 return rc; 564 } 565 566 next_group: 567 rc = ext4_filesystem_put_block_group_ref(bg_ref); 568 if (rc != EOK) 569 return rc; 540 block_put(bitmap_block); 541 ext4_filesystem_put_block_group_ref(bg_ref); 570 542 571 543 /* Goto next group */ … … 602 574 bg_ref->dirty = true; 603 575 604 rc =ext4_filesystem_put_block_group_ref(bg_ref);576 ext4_filesystem_put_block_group_ref(bg_ref); 605 577 606 578 *fblock = allocated_block; 607 return rc;579 return EOK; 608 580 } 609 581 … … 620 592 bool *free) 621 593 { 622 int rc ;594 int rc = EOK; 623 595 624 596 ext4_filesystem_t *fs = inode_ref->fs; … … 641 613 block_t *bitmap_block; 642 614 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 643 if (rc != EOK) { 644 ext4_filesystem_put_block_group_ref(bg_ref); 645 return rc; 646 } 615 if (rc != EOK) 616 return rc; 647 617 648 618 /* Check if block is free */
Note:
See TracChangeset
for help on using the changeset viewer.