Changes in uspace/lib/ext4/libext4_balloc.c [38542dc:d579acc] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_balloc.c
r38542dc rd579acc 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 free_blocks; 345 uint32_t goal; 351 346 352 347 /* Find GOAL */ 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 348 int rc = ext4_balloc_find_goal(inode_ref, &goal); 349 if (rc != EOK) 350 return rc; 351 359 352 ext4_superblock_t *sb = inode_ref->fs->superblock; 360 353 … … 366 359 /* Load block group reference */ 367 360 ext4_block_group_ref_t *bg_ref; 368 intrc = ext4_filesystem_get_block_group_ref(inode_ref->fs,361 rc = ext4_filesystem_get_block_group_ref(inode_ref->fs, 369 362 block_group, &bg_ref); 370 363 if (rc != EOK) 371 364 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 block_put(bitmap_block); 470 ext4_filesystem_put_block_group_ref(bg_ref); 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; 471 480 472 481 /* Try other block groups */ … … 481 490 if (rc != EOK) 482 491 return rc; 483 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 484 500 /* Load block with bitmap */ 485 501 bitmap_block_addr = … … 512 528 bitmap_block->dirty = true; 513 529 rc = block_put(bitmap_block); 514 if (rc != EOK) 530 if (rc != EOK) { 531 ext4_filesystem_put_block_group_ref(bg_ref); 515 532 return rc; 533 } 516 534 517 535 allocated_block = … … 528 546 bitmap_block->dirty = true; 529 547 rc = block_put(bitmap_block); 530 if (rc != EOK) 548 if (rc != EOK) { 549 ext4_filesystem_put_block_group_ref(bg_ref); 531 550 return rc; 551 } 532 552 533 553 allocated_block = … … 538 558 } 539 559 540 block_put(bitmap_block); 541 ext4_filesystem_put_block_group_ref(bg_ref); 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; 542 570 543 571 /* Goto next group */ … … 574 602 bg_ref->dirty = true; 575 603 576 ext4_filesystem_put_block_group_ref(bg_ref);604 rc = ext4_filesystem_put_block_group_ref(bg_ref); 577 605 578 606 *fblock = allocated_block; 579 return EOK;607 return rc; 580 608 } 581 609 … … 592 620 bool *free) 593 621 { 594 int rc = EOK;622 int rc; 595 623 596 624 ext4_filesystem_t *fs = inode_ref->fs; … … 613 641 block_t *bitmap_block; 614 642 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 615 if (rc != EOK) 616 return rc; 643 if (rc != EOK) { 644 ext4_filesystem_put_block_group_ref(bg_ref); 645 return rc; 646 } 617 647 618 648 /* Check if block is free */
Note:
See TracChangeset
for help on using the changeset viewer.