Changeset 5b0a3946 in mainline
- Timestamp:
- 2012-04-04T19:17:05Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9c2d19d
- Parents:
- e7ed26be
- Location:
- uspace/lib/ext4
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_balloc.c
re7ed26be r5b0a3946 163 163 ext4_balloc_get_bgid_of_block(sb, first + count); 164 164 165 assert(block_group_first ==block_group_last);165 EXT4FS_DBG("first =\%u (bg \%u), last = \%u (bg \%u)", first, block_group_first, first + count, block_group_last); 166 166 167 167 ext4_block_group_ref_t *bg_ref; -
uspace/lib/ext4/libext4_extent.c
re7ed26be r5b0a3946 326 326 } 327 327 328 int ext4_extent_release_block(ext4_inode_ref_t *inode_ref, uint32_t iblock)328 static int ext4_extent_release(ext4_inode_ref_t *inode_ref, ext4_extent_t* extent) 329 329 { 330 330 int rc; 331 331 332 uint64_t start = ext4_extent_get_start(extent); 333 uint16_t block_count = ext4_extent_get_block_count(extent); 334 335 rc = ext4_balloc_free_blocks(inode_ref, start, block_count); 336 if (rc != EOK) { 337 EXT4FS_DBG("ERROR"); 338 return rc; 339 } 340 341 return EOK; 342 } 343 344 // Recursive release 345 static int ext4_extent_release_branch(ext4_inode_ref_t *inode_ref, 346 ext4_extent_index_t *index) 347 { 348 int rc; 349 350 block_t* block; 351 352 uint32_t fblock = ext4_extent_index_get_leaf(index); 353 354 EXT4FS_DBG("fblock = \%u", fblock); 355 356 rc = block_get(&block, inode_ref->fs->device, fblock, BLOCK_FLAGS_NOREAD); 357 if (rc != EOK) { 358 EXT4FS_DBG("ERROR get_block"); 359 return rc; 360 } 361 362 ext4_extent_header_t *header = block->data; 363 364 if (ext4_extent_header_get_depth(header)) { 365 366 ext4_extent_index_t *idx = EXT4_EXTENT_FIRST_INDEX(header); 367 368 for (uint32_t i = 0; i < ext4_extent_header_get_entries_count(header); ++i, ++idx) { 369 rc = ext4_extent_release_branch(inode_ref, idx); 370 if (rc != EOK) { 371 EXT4FS_DBG("error recursion"); 372 return rc; 373 } 374 } 375 } else { 376 ext4_extent_t *ext = EXT4_EXTENT_FIRST(header); 377 378 for (uint32_t i = 0; i < ext4_extent_header_get_entries_count(header); ++i, ++ext) { 379 rc = ext4_extent_release(inode_ref, ext); 380 if (rc != EOK) { 381 EXT4FS_DBG("error recursion"); 382 return rc; 383 } 384 } 385 } 386 387 rc = block_put(block); 388 if (rc != EOK) { 389 EXT4FS_DBG("ERROR put_block"); 390 return rc; 391 } 392 393 ext4_balloc_free_block(inode_ref, fblock); 394 395 return EOK; 396 } 397 398 int ext4_extent_release_blocks_from(ext4_inode_ref_t *inode_ref, uint32_t iblock_from) 399 { 400 int rc; 401 402 // 1) Delete iblock and successors in the same extent 403 332 404 ext4_extent_path_t *path; 333 rc = ext4_extent_find_extent(inode_ref, iblock , &path);405 rc = ext4_extent_find_extent(inode_ref, iblock_from, &path); 334 406 if (rc != EOK) { 335 407 return rc; … … 338 410 ext4_extent_path_t *path_ptr = path; 339 411 while (path_ptr->depth != 0) { 340 EXT4FS_DBG("depth = \%u", path_ptr->depth);341 412 path_ptr++; 342 413 } … … 344 415 assert(path_ptr->extent != NULL); 345 416 346 uint32_t f block;347 f block = ext4_extent_get_start(path_ptr->extent) + iblock;348 f block -= ext4_extent_get_first_block(path_ptr->extent);417 uint32_t first_fblock; 418 first_fblock = ext4_extent_get_start(path_ptr->extent) + iblock_from; 419 first_fblock -= ext4_extent_get_first_block(path_ptr->extent); 349 420 350 421 uint16_t block_count = ext4_extent_get_block_count(path_ptr->extent); 351 422 352 assert((ext4_extent_get_first_block(path_ptr->extent) + block_count - 1) == iblock); 353 354 block_count--; 423 uint16_t delete_count = block_count - first_fblock + 424 ext4_extent_get_start(path_ptr->extent); 425 426 rc = ext4_balloc_free_blocks(inode_ref, first_fblock, delete_count); 427 428 block_count -= delete_count; 355 429 ext4_extent_set_block_count(path_ptr->extent, block_count); 356 430 … … 358 432 359 433 bool check_tree = false; 434 435 uint16_t old_root_entries = ext4_extent_header_get_entries_count(path->header); 360 436 361 437 if (block_count == 0) { … … 365 441 366 442 // If empty leaf, will be released and the whole tree must be checked 367 check_tree = true; 368 } 369 370 while (check_tree) { 371 372 if (path_ptr > path) { 373 // TODO 374 375 // zahodit fblock 443 if (path_ptr != path) { 376 444 rc = ext4_balloc_free_block(inode_ref, path_ptr->block->pba); 377 445 if (rc != EOK) { … … 379 447 // TODO 380 448 } 449 check_tree = true; 450 } 451 } 452 453 --path_ptr; 454 455 while ((path_ptr >= path) && check_tree) { 456 457 if (path_ptr > path) { 458 459 EXT4FS_DBG("not root"); 460 uint16_t entries = ext4_extent_header_get_entries_count(path_ptr->header); 461 entries--; 462 ext4_extent_header_set_entries_count(path_ptr->header, entries); 463 464 if (entries == 0) { 465 rc = ext4_balloc_free_block(inode_ref, path_ptr->block->pba); 466 if (rc != EOK) { 467 EXT4FS_DBG("ERROR"); 468 // TODO 469 } 470 } else { 471 break; 472 } 473 381 474 } else { 382 check_tree = false; 475 EXT4FS_DBG("root"); 476 477 // TODO tady je BUG asi 478 479 uint16_t entries = ext4_extent_header_get_entries_count(path_ptr->header); 480 entries--; 481 ext4_extent_header_set_entries_count(path_ptr->header, entries); 482 483 break; 383 484 } 384 485 385 486 path_ptr--; 386 387 uint16_t entries = ext4_extent_header_get_entries_count(path_ptr->header); 388 entries--; 389 ext4_extent_header_set_entries_count(path_ptr->header, entries); 390 391 if (entries > 0) { 392 check_tree = false; 393 } 394 } 395 396 rc = ext4_balloc_free_block(inode_ref, fblock); 397 if (rc != EOK) { 398 EXT4FS_DBG("ERROR"); 399 // TODO handle error 487 } 488 489 ext4_extent_header_t *header = path->header; 490 491 // 2) delete or successors first level extents/indexes 492 if (ext4_extent_header_get_depth(header)) { 493 494 ext4_extent_index_t *index = path->index + 1; 495 ext4_extent_index_t *stop = EXT4_EXTENT_FIRST_INDEX(header) + 496 old_root_entries; 497 498 if (index < stop) { 499 inode_ref->dirty = true; 500 } 501 502 while (index < stop) { 503 rc = ext4_extent_release_branch(inode_ref, index); 504 if (rc != EOK) { 505 EXT4FS_DBG("ERR"); 506 // TODO error 507 } 508 ++index; 509 510 uint16_t entries = ext4_extent_header_get_entries_count(header); 511 entries--; 512 ext4_extent_header_set_entries_count(header, entries); 513 514 } 515 516 } else { 517 518 ext4_extent_t *extent = path->extent + 1; 519 ext4_extent_t *stop = EXT4_EXTENT_FIRST(header) + 520 old_root_entries; 521 522 if (extent != stop) { 523 inode_ref->dirty = true; 524 } 525 526 while (extent < stop) { 527 rc = ext4_extent_release(inode_ref, extent); 528 if (rc != EOK) { 529 EXT4FS_DBG("ERR"); 530 // TODO error 531 } 532 ++extent; 533 534 uint16_t entries = ext4_extent_header_get_entries_count(header); 535 entries--; 536 ext4_extent_header_set_entries_count(header, entries); 537 } 400 538 } 401 539 … … 413 551 free(path); 414 552 415 416 553 return EOK; 417 554 } -
uspace/lib/ext4/libext4_extent.h
re7ed26be r5b0a3946 62 62 63 63 extern int ext4_extent_find_block(ext4_inode_ref_t *, uint32_t, uint32_t *); 64 extern int ext4_extent_release_block (ext4_inode_ref_t *, uint32_t);64 extern int ext4_extent_release_blocks_from(ext4_inode_ref_t *, uint32_t); 65 65 66 66 #endif -
uspace/lib/ext4/libext4_filesystem.c
re7ed26be r5b0a3946 216 216 217 217 if (ref->dirty) { 218 218 uint16_t checksum = ext4_filesystem_bg_checksum( 219 219 ref->fs->superblock, ref->index, ref->block_group); 220 220 221 221 ext4_block_group_set_checksum(ref->block_group, checksum); 222 222 223 223 ref->block->dirty = true; … … 523 523 } 524 524 525 // starting from 1 because of logical blocks are numbered from 0 526 for (uint32_t i = 1; i <= diff_blocks_count; ++i) { 527 rc = ext4_filesystem_release_inode_block(inode_ref, old_blocks_count - i); 528 if (rc != EOK) { 529 return rc; 525 if (ext4_superblock_has_feature_incompatible( 526 inode_ref->fs->superblock, EXT4_FEATURE_INCOMPAT_EXTENTS) && 527 ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS)) { 528 529 rc = ext4_extent_release_blocks_from(inode_ref, old_blocks_count - diff_blocks_count); 530 if (rc != EOK) { 531 return rc; 532 } 533 } else { 534 // starting from 1 because of logical blocks are numbered from 0 535 for (uint32_t i = 1; i <= diff_blocks_count; ++i) { 536 rc = ext4_filesystem_release_inode_block(inode_ref, old_blocks_count - i); 537 if (rc != EOK) { 538 return rc; 539 } 530 540 } 531 541 } … … 783 793 ext4_filesystem_t *fs = inode_ref->fs; 784 794 785 if (ext4_superblock_has_feature_incompatible(fs->superblock, EXT4_FEATURE_INCOMPAT_EXTENTS) && 786 ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS)) { 787 788 return ext4_extent_release_block(inode_ref, iblock); 789 } 795 // EXTENTS are handled 796 assert(! (ext4_superblock_has_feature_incompatible(fs->superblock, 797 EXT4_FEATURE_INCOMPAT_EXTENTS) && 798 ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS))); 790 799 791 800 ext4_inode_t *inode = inode_ref->inode;
Note:
See TracChangeset
for help on using the changeset viewer.