Changeset cd1cc4e6 in mainline for uspace/lib/ext4/libext4_directory.c


Ignore:
Timestamp:
2012-01-24T16:32:32Z (13 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
02aad10
Parents:
786bd56
Message:

bugfixes of inode allocation and link operation

File:
1 edited

Legend:

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

    r786bd56 rcd1cc4e6  
    9595}
    9696
     97uint8_t ext4_directory_entry_ll_get_inode_type(
     98                ext4_superblock_t *sb, ext4_directory_entry_ll_t *de)
     99{
     100        if (ext4_superblock_get_rev_level(sb) == 0 &&
     101                    ext4_superblock_get_minor_rev_level(sb) < 5) {
     102
     103                        return de->inode_type;
     104        }
     105
     106        return EXT4_DIRECTORY_FILETYPE_UNKNOWN;
     107
     108}
     109
     110void ext4_directory_entry_ll_set_inode_type(
     111                ext4_superblock_t *sb, ext4_directory_entry_ll_t *de, uint8_t type)
     112{
     113        if (ext4_superblock_get_rev_level(sb) == 0 &&
     114                        ext4_superblock_get_minor_rev_level(sb) < 5) {
     115
     116                de->inode_type = type;
     117        }
     118
     119        // else do nothing
     120
     121}
    97122
    98123int ext4_directory_iterator_init(ext4_directory_iterator_t *it,
     
    261286
    262287int ext4_directory_add_entry(ext4_filesystem_t *fs, ext4_inode_ref_t * inode_ref,
    263                 const char *entry_name, uint32_t child_inode)
    264 {
     288                const char *entry_name, ext4_inode_ref_t *child)
     289{
     290        EXT4FS_DBG("adding dentry \%s to inode \%u", entry_name, child->index);
     291
    265292        int rc;
    266293
     
    283310
    284311                        // Don't touch entry length
    285                         ext4_directory_entry_ll_set_inode(it.current, child_inode);
     312                        ext4_directory_entry_ll_set_inode(it.current, child->index);
    286313                        ext4_directory_entry_ll_set_name_length(fs->superblock, it.current, name_len);
    287314                        it.current_block->dirty = true;
     
    290317
    291318                if (entry_inode != 0) {
    292 
    293319                        uint16_t used_name_len = ext4_directory_entry_ll_get_name_length(
    294320                                        fs->superblock, it.current);
    295321                        uint16_t free_space = rec_len - 8 - (used_name_len + (4- used_name_len % 4));
    296322
     323                        EXT4FS_DBG("rec_len = \%u, free_space == \%u, required_len = \%u", rec_len, free_space, required_len);
     324
    297325                        if (free_space >= required_len) {
    298326                                uint16_t used_len = rec_len - free_space;
     
    301329                                ext4_directory_entry_ll_set_entry_length(it.current, used_len);
    302330
    303                                 // Jump to newly created
    304                                 rc = ext4_directory_iterator_next(&it);
    305                                 if (rc != EOK) {
    306                                         return rc;
    307                                 }
     331                                // SEEK manually
     332                                it.current_offset += used_len;
     333                                ext4_directory_entry_ll_t *new_entry = it.current_block->data + it.current_offset;
    308334
    309335                                // We are sure, that both entries are in the same data block
    310336                                // dirtyness will be set now
    311337
    312                                 ext4_directory_entry_ll_set_inode(it.current, child_inode);
    313                                 ext4_directory_entry_ll_set_entry_length(it.current, free_space);
     338                                ext4_directory_entry_ll_set_inode(new_entry, child->index);
     339                                ext4_directory_entry_ll_set_entry_length(new_entry, free_space);
    314340                                ext4_directory_entry_ll_set_name_length(
    315                                                 fs->superblock, it.current, name_len);
    316                                 memcpy(it.current->name, entry_name, name_len);
     341                                                fs->superblock, new_entry, name_len);
     342
     343                                if (ext4_inode_is_type(fs->superblock, child->inode, EXT4_INODE_MODE_DIRECTORY)) {
     344                                        ext4_directory_entry_ll_set_inode_type(
     345                                                        fs->superblock, new_entry, EXT4_DIRECTORY_FILETYPE_DIR);
     346                                } else {
     347                                        ext4_directory_entry_ll_set_inode_type(
     348                                                        fs->superblock, new_entry, EXT4_DIRECTORY_FILETYPE_REG_FILE);
     349                                }
     350
     351                                memcpy(new_entry->name, entry_name, name_len);
    317352                                it.current_block->dirty = true;
    318353                                return ext4_directory_iterator_fini(&it);
     
    367402
    368403        // Entry length is not affected
    369         ext4_directory_entry_ll_set_inode(it.current, child_inode);
     404        ext4_directory_entry_ll_set_inode(it.current, child->index);
    370405        ext4_directory_entry_ll_set_name_length(fs->superblock, it.current, name_len);
    371406        memcpy(it.current->name, entry_name, name_len);
Note: See TracChangeset for help on using the changeset viewer.