Changeset cd1cc4e6 in mainline for uspace/lib/ext4/libext4_directory.c
- Timestamp:
- 2012-01-24T16:32:32Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 02aad10
- Parents:
- 786bd56
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_directory.c
r786bd56 rcd1cc4e6 95 95 } 96 96 97 uint8_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 110 void 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 } 97 122 98 123 int ext4_directory_iterator_init(ext4_directory_iterator_t *it, … … 261 286 262 287 int 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 265 292 int rc; 266 293 … … 283 310 284 311 // 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); 286 313 ext4_directory_entry_ll_set_name_length(fs->superblock, it.current, name_len); 287 314 it.current_block->dirty = true; … … 290 317 291 318 if (entry_inode != 0) { 292 293 319 uint16_t used_name_len = ext4_directory_entry_ll_get_name_length( 294 320 fs->superblock, it.current); 295 321 uint16_t free_space = rec_len - 8 - (used_name_len + (4- used_name_len % 4)); 296 322 323 EXT4FS_DBG("rec_len = \%u, free_space == \%u, required_len = \%u", rec_len, free_space, required_len); 324 297 325 if (free_space >= required_len) { 298 326 uint16_t used_len = rec_len - free_space; … … 301 329 ext4_directory_entry_ll_set_entry_length(it.current, used_len); 302 330 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; 308 334 309 335 // We are sure, that both entries are in the same data block 310 336 // dirtyness will be set now 311 337 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); 314 340 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); 317 352 it.current_block->dirty = true; 318 353 return ext4_directory_iterator_fini(&it); … … 367 402 368 403 // 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); 370 405 ext4_directory_entry_ll_set_name_length(fs->superblock, it.current, name_len); 371 406 memcpy(it.current->name, entry_name, name_len);
Note:
See TracChangeset
for help on using the changeset viewer.