Changeset ed6fdc7 in mainline


Ignore:
Timestamp:
2012-01-25T18:02:28Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3ce5162
Parents:
db2f654
Message:

Bugfix during new block allocation

File:
1 edited

Legend:

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

    rdb2f654 red6fdc7  
    260260}
    261261
    262 /**
    263  * Fill data block with invalid directory entry.
    264  */
    265 static int ext4_directory_init_block(ext4_filesystem_t *fs, uint32_t fblock)
    266 {
    267         int rc;
    268 
    269         block_t *block;
    270         rc = block_get(&block, fs->device, fblock, BLOCK_FLAGS_NOREAD);
    271         if (rc != EOK) {
    272                 return rc;
    273         }
    274 
    275         ext4_directory_entry_ll_t *entry = block->data;
    276         uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
    277 
    278         ext4_directory_entry_ll_set_entry_length(entry, block_size);
    279         ext4_directory_entry_ll_set_inode(entry, 0);
    280         ext4_directory_entry_ll_set_name_length(fs->superblock, entry, 0);
    281         entry->name[0] = 0;
    282 
    283         block->dirty = true;
    284         return block_put(block);
    285 }
    286 
    287262int ext4_directory_add_entry(ext4_filesystem_t *fs, ext4_inode_ref_t * inode_ref,
    288263                const char *entry_name, ext4_inode_ref_t *child)
    289264{
    290         EXT4FS_DBG("adding dentry \%s to inode \%u", entry_name, child->index);
     265        EXT4FS_DBG("adding dentry \%s to child inode \%u to directory \%u", entry_name, child->index, inode_ref->index);
    291266
    292267        int rc;
     
    306281                uint32_t entry_inode = ext4_directory_entry_ll_get_inode(it.current);
    307282                uint16_t rec_len = ext4_directory_entry_ll_get_entry_length(it.current);
     283
     284                EXT4FS_DBG("inode = \%u, rec_len == \%u, required_len = \%u", entry_inode, rec_len, required_len);
    308285
    309286                if ((entry_inode == 0) && (rec_len >= required_len)) {
     
    320297                                        fs->superblock, it.current);
    321298                        uint16_t free_space = rec_len - 8 - (used_name_len + (4- used_name_len % 4));
    322 
    323                         EXT4FS_DBG("rec_len = \%u, free_space == \%u, required_len = \%u", rec_len, free_space, required_len);
    324299
    325300                        if (free_space >= required_len) {
     
    388363                }
    389364
     365                uint64_t inode_size = ext4_inode_get_size(fs->superblock, inode_ref->inode);
     366                inode_size += block_size;
     367                ext4_inode_set_size(inode_ref->inode, inode_size);
     368
    390369                inode_ref->dirty = true;
    391 
    392                 rc = ext4_directory_init_block(fs, fblock);
    393                 if (rc != EOK) {
    394                         return rc;
    395                 }
    396         }
    397 
    398         rc = ext4_directory_iterator_init(&it, fs, inode_ref, pos);
     370        }
     371
     372        // Load block
     373        block_t *new_block;
     374        rc = block_get(&new_block, fs->device, fblock, BLOCK_FLAGS_NOREAD);
    399375        if (rc != EOK) {
    400376                return rc;
    401377        }
    402378
    403         // Entry length is not affected
    404         ext4_directory_entry_ll_set_inode(it.current, child->index);
    405         ext4_directory_entry_ll_set_name_length(fs->superblock, it.current, name_len);
    406         memcpy(it.current->name, entry_name, name_len);
    407 
    408         it.current_block->dirty = true;
    409 
    410         return ext4_directory_iterator_fini(&it);
     379        ext4_directory_entry_ll_t *block_entry = new_block->data;
     380
     381        ext4_directory_entry_ll_set_entry_length(block_entry, block_size);
     382        ext4_directory_entry_ll_set_inode(block_entry, child->index);
     383        ext4_directory_entry_ll_set_name_length(fs->superblock, block_entry, name_len);
     384        memcpy(block_entry->name, entry_name, name_len);
     385
     386        new_block->dirty = true;
     387        rc = block_put(new_block);
     388        if (rc != EOK) {
     389                return rc;
     390        }
     391
     392        return EOK;
    411393}
    412394
Note: See TracChangeset for help on using the changeset viewer.