Changeset cf982ff in mainline for uspace/lib/ext4/libext4_balloc.c
- Timestamp:
- 2014-01-28T21:08:38Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0dd022ec
- Parents:
- 476f62c (diff), 5828554 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_balloc.c
r476f62c rcf982ff 91 91 block_t *bitmap_block; 92 92 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 93 if (rc != EOK) 94 return rc; 93 if (rc != EOK) { 94 ext4_filesystem_put_block_group_ref(bg_ref); 95 return rc; 96 } 95 97 96 98 /* Modify bitmap */ … … 130 132 131 133 /* Release block group reference */ 132 rc = ext4_filesystem_put_block_group_ref(bg_ref); 133 if (rc != EOK) 134 return rc; 135 136 return EOK; 134 return ext4_filesystem_put_block_group_ref(bg_ref); 137 135 } 138 136 … … 173 171 block_t *bitmap_block; 174 172 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 175 if (rc != EOK) 176 return rc; 173 if (rc != EOK) { 174 ext4_filesystem_put_block_group_ref(bg_ref); 175 return rc; 176 } 177 177 178 178 /* Modify bitmap */ … … 212 212 213 213 /* Release block group reference */ 214 rc = ext4_filesystem_put_block_group_ref(bg_ref); 215 if (rc != EOK) 216 return rc; 217 218 return EOK; 214 return ext4_filesystem_put_block_group_ref(bg_ref); 219 215 } 220 216 … … 264 260 * 265 261 */ 266 static uint32_t ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref)262 static int ext4_balloc_find_goal(ext4_inode_ref_t *inode_ref, uint32_t *goal) 267 263 { 268 uint32_t goal = 0; 269 264 *goal = 0; 270 265 ext4_superblock_t *sb = inode_ref->fs->superblock; 271 266 … … 280 275 if (inode_block_count > 0) { 281 276 int rc = ext4_filesystem_get_inode_data_block_index(inode_ref, 282 inode_block_count - 1, &goal);277 inode_block_count - 1, goal); 283 278 if (rc != EOK) 284 return 0;279 return rc; 285 280 286 281 if (goal != 0) { 287 goal++;288 return goal;282 (*goal)++; 283 return EOK; 289 284 } 290 285 … … 302 297 block_group, &bg_ref); 303 298 if (rc != EOK) 304 return 0;299 return rc; 305 300 306 301 /* Compute indexes */ … … 327 322 inode_table_blocks++; 328 323 329 goal = inode_table_first_block + inode_table_blocks; 330 331 ext4_filesystem_put_block_group_ref(bg_ref); 332 333 return goal; 324 *goal = inode_table_first_block + inode_table_blocks; 325 326 return ext4_filesystem_put_block_group_ref(bg_ref); 334 327 } 335 328 … … 349 342 block_t *bitmap_block; 350 343 uint32_t rel_block_idx = 0; 344 uint32_t goal; 351 345 352 346 /* Find GOAL */ 353 uint32_t goal = ext4_balloc_find_goal(inode_ref); 354 if (goal == 0) { 347 int rc = ext4_balloc_find_goal(inode_ref, &goal); 348 if (rc != EOK) 349 return rc; 350 else if (goal == 0) { 355 351 /* no goal found => partition is full */ 356 return ENO SPC;352 return ENOMEM; 357 353 } 358 354 … … 366 362 /* Load block group reference */ 367 363 ext4_block_group_ref_t *bg_ref; 368 intrc = ext4_filesystem_get_block_group_ref(inode_ref->fs,364 rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, 369 365 block_group, &bg_ref); 370 366 if (rc != EOK) … … 467 463 468 464 /* No free block found yet */ 469 block_put(bitmap_block); 470 ext4_filesystem_put_block_group_ref(bg_ref); 465 rc = block_put(bitmap_block); 466 if (rc != EOK) { 467 ext4_filesystem_put_block_group_ref(bg_ref); 468 return rc; 469 } 470 471 rc = ext4_filesystem_put_block_group_ref(bg_ref); 472 if (rc != EOK) 473 return rc; 471 474 472 475 /* Try other block groups */ … … 512 515 bitmap_block->dirty = true; 513 516 rc = block_put(bitmap_block); 514 if (rc != EOK) 517 if (rc != EOK) { 518 ext4_filesystem_put_block_group_ref(bg_ref); 515 519 return rc; 520 } 516 521 517 522 allocated_block = … … 528 533 bitmap_block->dirty = true; 529 534 rc = block_put(bitmap_block); 530 if (rc != EOK) 535 if (rc != EOK) { 536 ext4_filesystem_put_block_group_ref(bg_ref); 531 537 return rc; 538 } 532 539 533 540 allocated_block = … … 538 545 } 539 546 540 block_put(bitmap_block); 541 ext4_filesystem_put_block_group_ref(bg_ref); 547 rc = block_put(bitmap_block); 548 if (rc != EOK) { 549 ext4_filesystem_put_block_group_ref(bg_ref); 550 return rc; 551 } 552 553 rc = ext4_filesystem_put_block_group_ref(bg_ref); 554 if (rc != EOK) 555 return rc; 542 556 543 557 /* Goto next group */ … … 574 588 bg_ref->dirty = true; 575 589 576 ext4_filesystem_put_block_group_ref(bg_ref);590 rc = ext4_filesystem_put_block_group_ref(bg_ref); 577 591 578 592 *fblock = allocated_block; 579 return EOK;593 return rc; 580 594 } 581 595 … … 592 606 bool *free) 593 607 { 594 int rc = EOK;608 int rc; 595 609 596 610 ext4_filesystem_t *fs = inode_ref->fs; … … 613 627 block_t *bitmap_block; 614 628 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 615 if (rc != EOK) 616 return rc; 629 if (rc != EOK) { 630 ext4_filesystem_put_block_group_ref(bg_ref); 631 return rc; 632 } 617 633 618 634 /* Check if block is free */
Note:
See TracChangeset
for help on using the changeset viewer.