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


Ignore:
Timestamp:
2012-01-30T09:23:12Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
512a7df
Parents:
7c506ced
Message:

Bugfix for higher filesystem version (directory entry type not setting properly)

File:
1 edited

Legend:

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

    r7c506ced r1d69c69  
    9898                ext4_superblock_t *sb, ext4_directory_entry_ll_t *de)
    9999{
    100         if (ext4_superblock_get_rev_level(sb) == 0 &&
    101                     ext4_superblock_get_minor_rev_level(sb) < 5) {
     100        if (ext4_superblock_get_rev_level(sb) > 0 ||
     101                    ext4_superblock_get_minor_rev_level(sb) >= 5) {
    102102
    103103                        return de->inode_type;
     
    111111                ext4_superblock_t *sb, ext4_directory_entry_ll_t *de, uint8_t type)
    112112{
    113         if (ext4_superblock_get_rev_level(sb) == 0 &&
    114                         ext4_superblock_get_minor_rev_level(sb) < 5) {
     113        if (ext4_superblock_get_rev_level(sb) > 0 ||
     114                        ext4_superblock_get_minor_rev_level(sb) >= 5) {
    115115
    116116                de->inode_type = type;
     
    260260}
    261261
     262static void ext4_directory_write_entry(ext4_superblock_t *sb,
     263                ext4_directory_entry_ll_t *entry, uint16_t entry_len,
     264                ext4_inode_ref_t *child, const char *name, size_t name_len)
     265{
     266        ext4_directory_entry_ll_set_inode(entry, child->index);
     267        ext4_directory_entry_ll_set_entry_length(entry, entry_len);
     268        ext4_directory_entry_ll_set_name_length(sb, entry, name_len);
     269
     270        if (ext4_inode_is_type(sb, child->inode, EXT4_INODE_MODE_DIRECTORY)) {
     271                ext4_directory_entry_ll_set_inode_type(
     272                                sb, entry, EXT4_DIRECTORY_FILETYPE_DIR);
     273        } else {
     274                ext4_directory_entry_ll_set_inode_type(
     275                                sb, entry, EXT4_DIRECTORY_FILETYPE_REG_FILE);
     276        }
     277        memcpy(entry->name, name, name_len);
     278}
     279
    262280int ext4_directory_add_entry(ext4_filesystem_t *fs, ext4_inode_ref_t * inode_ref,
    263281                const char *entry_name, ext4_inode_ref_t *child)
     
    282300                if ((entry_inode == 0) && (rec_len >= required_len)) {
    283301
    284                         // Don't touch entry length
    285                         ext4_directory_entry_ll_set_inode(it.current, child->index);
    286                         ext4_directory_entry_ll_set_name_length(fs->superblock, it.current, name_len);
     302
     303                        ext4_directory_write_entry(fs->superblock, it.current, rec_len,
     304                                        child, entry_name, name_len);
    287305                        it.current_block->dirty = true;
    288306                        return ext4_directory_iterator_fini(&it);
     
    307325                                // dirtyness will be set now
    308326
    309                                 ext4_directory_entry_ll_set_inode(new_entry, child->index);
    310                                 ext4_directory_entry_ll_set_entry_length(new_entry, free_space);
    311                                 ext4_directory_entry_ll_set_name_length(
    312                                                 fs->superblock, new_entry, name_len);
    313 
    314                                 if (ext4_inode_is_type(fs->superblock, child->inode, EXT4_INODE_MODE_DIRECTORY)) {
    315                                         ext4_directory_entry_ll_set_inode_type(
    316                                                         fs->superblock, new_entry, EXT4_DIRECTORY_FILETYPE_DIR);
    317                                 } else {
    318                                         ext4_directory_entry_ll_set_inode_type(
    319                                                         fs->superblock, new_entry, EXT4_DIRECTORY_FILETYPE_REG_FILE);
    320                                 }
    321 
    322                                 memcpy(new_entry->name, entry_name, name_len);
     327                                ext4_directory_write_entry(fs->superblock, new_entry,
     328                                                free_space, child, entry_name, name_len);
    323329                                it.current_block->dirty = true;
    324330                                return ext4_directory_iterator_fini(&it);
     
    378384        ext4_directory_entry_ll_t *block_entry = new_block->data;
    379385
    380         ext4_directory_entry_ll_set_entry_length(block_entry, block_size);
    381         ext4_directory_entry_ll_set_inode(block_entry, child->index);
    382         ext4_directory_entry_ll_set_name_length(fs->superblock, block_entry, name_len);
    383         memcpy(block_entry->name, entry_name, name_len);
     386        ext4_directory_write_entry(fs->superblock, block_entry, block_size,
     387        child, entry_name, name_len);
    384388
    385389        new_block->dirty = true;
Note: See TracChangeset for help on using the changeset viewer.