Changeset 1ac1ab4 in mainline for uspace/lib/ext4/libext4_directory.c


Ignore:
Timestamp:
2012-03-31T20:00:15Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a2fa350
Parents:
38384ae
Message:

simplied headers of more functions, improved bg_ref and inode_ref structures, added block group checksumming and fixed bug in block_group values updating

File:
1 edited

Legend:

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

    r38384ae r1ac1ab4  
    186186
    187187                uint32_t next_block_phys_idx;
    188                 rc = ext4_filesystem_get_inode_data_block_index(it->fs,
    189                     it->inode_ref, next_block_idx, &next_block_phys_idx);
     188                rc = ext4_filesystem_get_inode_data_block_index(it->inode_ref,
     189                                next_block_idx, &next_block_phys_idx);
    190190                if (rc != EOK) {
    191191                        return rc;
     
    260260}
    261261
    262 int ext4_directory_append_block(ext4_filesystem_t *fs,
    263                 ext4_inode_ref_t *inode_ref, uint32_t *fblock, uint32_t *iblock)
     262int ext4_directory_append_block(ext4_inode_ref_t *inode_ref,
     263                uint32_t *fblock, uint32_t *iblock)
    264264{
    265265        int rc;
    266266
     267        ext4_superblock_t *sb = inode_ref->fs->superblock;
     268
    267269        // Compute next block index and allocate data block
    268         uint64_t inode_size = ext4_inode_get_size(fs->superblock, inode_ref->inode);
    269         uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
     270        uint64_t inode_size = ext4_inode_get_size(sb, inode_ref->inode);
     271        uint32_t block_size = ext4_superblock_get_block_size(sb);
    270272
    271273        assert(inode_size % block_size == 0);
     
    275277
    276278        uint32_t phys_block;
    277         rc =  ext4_balloc_alloc_block(fs, inode_ref, &phys_block);
     279        rc =  ext4_balloc_alloc_block(inode_ref, &phys_block);
    278280        if (rc != EOK) {
    279281                return rc;
    280282        }
    281283
    282         rc = ext4_filesystem_set_inode_data_block_index(fs, inode_ref, new_block_idx, phys_block);
     284        rc = ext4_filesystem_set_inode_data_block_index(inode_ref, new_block_idx, phys_block);
    283285        if (rc != EOK) {
    284                 ext4_balloc_free_block(fs, inode_ref, phys_block);
     286                ext4_balloc_free_block(inode_ref, phys_block);
    285287                return rc;
    286288        }
     
    313315}
    314316
    315 int ext4_directory_add_entry(ext4_filesystem_t *fs, ext4_inode_ref_t * parent,
     317int ext4_directory_add_entry(ext4_inode_ref_t * parent,
    316318                const char *name, ext4_inode_ref_t *child)
    317319{
     
    319321
    320322        EXT4FS_DBG("adding entry to directory \%u [ino = \%u, name = \%s]", parent->index, child->index, name);
     323
     324        ext4_filesystem_t *fs = parent->fs;
    321325
    322326        // Index adding (if allowed)
     
    324328                        ext4_inode_has_flag(parent->inode, EXT4_INODE_FLAG_INDEX)) {
    325329
    326                 rc = ext4_directory_dx_add_entry(fs, parent, child, name);
     330                rc = ext4_directory_dx_add_entry(parent, child, name);
    327331
    328332                // Check if index is not corrupted
     
    356360        for (iblock = 0; iblock < total_blocks; ++iblock) {
    357361
    358                 rc = ext4_filesystem_get_inode_data_block_index(fs, parent, iblock, &fblock);
     362                rc = ext4_filesystem_get_inode_data_block_index(parent, iblock, &fblock);
    359363                if (rc != EOK) {
    360364                        return rc;
     
    384388        // No free block found - needed to allocate next block
    385389
    386         rc = ext4_directory_append_block(fs, parent, &fblock, &iblock);
     390        rc = ext4_directory_append_block(parent, &fblock, &iblock);
    387391        if (rc != EOK) {
    388392                return rc;
     
    411415}
    412416
    413 int ext4_directory_find_entry(ext4_filesystem_t *fs,
    414                 ext4_directory_search_result_t *result, ext4_inode_ref_t *parent,
    415                 const char *name)
     417int ext4_directory_find_entry(ext4_directory_search_result_t *result,
     418                ext4_inode_ref_t *parent, const char *name)
    416419{
    417420        int rc;
    418421        uint32_t name_len = strlen(name);
    419422
     423        ext4_superblock_t *sb = parent->fs->superblock;
     424
    420425        // Index search
    421         if (ext4_superblock_has_feature_compatible(fs->superblock, EXT4_FEATURE_COMPAT_DIR_INDEX) &&
     426        if (ext4_superblock_has_feature_compatible(sb, EXT4_FEATURE_COMPAT_DIR_INDEX) &&
    422427                        ext4_inode_has_flag(parent->inode, EXT4_INODE_FLAG_INDEX)) {
    423428
    424                 rc = ext4_directory_dx_find_entry(result, fs, parent, name_len, name);
     429                rc = ext4_directory_dx_find_entry(result, parent, name_len, name);
    425430
    426431                // Check if index is not corrupted
     
    437442
    438443        uint32_t iblock, fblock;
    439         uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
    440         uint32_t inode_size = ext4_inode_get_size(fs->superblock, parent->inode);
     444        uint32_t block_size = ext4_superblock_get_block_size(sb);
     445        uint32_t inode_size = ext4_inode_get_size(sb, parent->inode);
    441446        uint32_t total_blocks = inode_size / block_size;
    442447
    443448        for (iblock = 0; iblock < total_blocks; ++iblock) {
    444449
    445                 rc = ext4_filesystem_get_inode_data_block_index(fs, parent, iblock, &fblock);
     450                rc = ext4_filesystem_get_inode_data_block_index(parent, iblock, &fblock);
    446451                if (rc != EOK) {
    447452                        return rc;
     
    449454
    450455                block_t *block;
    451                 rc = block_get(&block, fs->device, fblock, BLOCK_FLAGS_NONE);
     456                rc = block_get(&block, parent->fs->device, fblock, BLOCK_FLAGS_NONE);
    452457                if (rc != EOK) {
    453458                        return rc;
     
    456461                // find block entry
    457462                ext4_directory_entry_ll_t *res_entry;
    458                 rc = ext4_directory_find_in_block(block, fs->superblock, name_len, name, &res_entry);
     463                rc = ext4_directory_find_in_block(block, sb, name_len, name, &res_entry);
    459464                if (rc == EOK) {
    460465                        result->block = block;
     
    476481
    477482
    478 int ext4_directory_remove_entry(ext4_filesystem_t* fs,
    479                 ext4_inode_ref_t *parent, const char *name)
     483int ext4_directory_remove_entry(ext4_inode_ref_t *parent, const char *name)
    480484{
    481485        int rc;
    482486
    483         if (!ext4_inode_is_type(fs->superblock, parent->inode,
     487        if (!ext4_inode_is_type(parent->fs->superblock, parent->inode,
    484488            EXT4_INODE_MODE_DIRECTORY)) {
    485489                return ENOTDIR;
     
    487491
    488492        ext4_directory_search_result_t result;
    489         rc  = ext4_directory_find_entry(fs, &result, parent, name);
     493        rc  = ext4_directory_find_entry(&result, parent, name);
    490494        if (rc != EOK) {
    491495                return rc;
Note: See TracChangeset for help on using the changeset viewer.