Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 936132f in mainline


Ignore:
Timestamp:
2012-04-08T12:19:12Z (10 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master
Children:
b73530a
Parents:
847f2cb
Message:

extent file initialization and allocation

Location:
uspace/lib/ext4
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ext4/libext4_extent.c

    r847f2cb r936132f  
    550550        uint64_t inode_size = ext4_inode_get_size(sb, inode_ref->inode);
    551551
    552         ext4_extent_header_t *header =
    553                         ext4_inode_get_extent_header(inode_ref->inode);
    554 
    555         // Initialize if empty inode
    556         if (inode_size == 0) {
    557                 ext4_extent_t *first = EXT4_EXTENT_FIRST(header);
    558                 ext4_extent_set_block_count(first, 0);
    559                 ext4_extent_set_first_block(first, 0);
    560                 ext4_extent_set_start(first, 0);
    561 
    562                 ext4_extent_header_set_depth(header, 0);
    563                 ext4_extent_header_set_entries_count(header, 1);
    564         }
    565 
    566552        uint32_t block_size = ext4_superblock_get_block_size(sb);
    567553        uint32_t new_block_idx = inode_size / block_size;
     
    579565        }
    580566
    581         // Check if extent exists
    582         assert(path_ptr->extent != NULL);
     567        // if extent == NULL -> add extent to leaf
     568        if (path_ptr->extent == NULL) {
     569                ext4_extent_t *ext = EXT4_EXTENT_FIRST(path_ptr->header);
     570                ext4_extent_set_block_count(ext, 0);
     571
     572                ext4_extent_header_set_entries_count(path_ptr->header, 1);
     573
     574                path_ptr->extent = ext;
     575        }
    583576
    584577        uint32_t phys_block;
  • uspace/lib/ext4/libext4_filesystem.c

    r847f2cb r936132f  
    342342        }
    343343
    344         if (ext4_superblock_has_feature_incompatible(
    345                         fs->superblock, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
    346                 ext4_inode_set_flag(inode, EXT4_INODE_FLAG_EXTENTS);
    347         }
    348 
    349344        ext4_inode_set_uid(inode, 0);
    350345        ext4_inode_set_gid(inode, 0);
     
    358353        ext4_inode_set_generation(inode, 0);
    359354
     355        // Reset blocks array
    360356        for (uint32_t i = 0; i < EXT4_INODE_BLOCKS; i++) {
    361357                inode->blocks[i] = 0;
     358        }
     359
     360        if (ext4_superblock_has_feature_incompatible(
     361                        fs->superblock, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
     362
     363                ext4_inode_set_flag(inode, EXT4_INODE_FLAG_EXTENTS);
     364
     365                // Initialize extent root header
     366                ext4_extent_header_t *header = ext4_inode_get_extent_header(inode);
     367                ext4_extent_header_set_depth(header, 0);
     368                ext4_extent_header_set_entries_count(header, 0);
     369                ext4_extent_header_set_generation(header, 0);
     370                ext4_extent_header_set_magic(header, EXT4_EXTENT_MAGIC);
     371
     372                uint16_t max_entries = (EXT4_INODE_BLOCKS * sizeof (uint32_t) - sizeof(ext4_extent_header_t))
     373                                / sizeof(ext4_extent_t);
     374
     375                ext4_extent_header_set_max_entries_count(header, max_entries);
    362376        }
    363377
Note: See TracChangeset for help on using the changeset viewer.