Changeset ed6fdc7 in mainline for uspace/lib/ext4/libext4_directory.c
- Timestamp:
- 2012-01-25T18:02:28Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3ce5162
- Parents:
- db2f654
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_directory.c
rdb2f654 red6fdc7 260 260 } 261 261 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 287 262 int ext4_directory_add_entry(ext4_filesystem_t *fs, ext4_inode_ref_t * inode_ref, 288 263 const char *entry_name, ext4_inode_ref_t *child) 289 264 { 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); 291 266 292 267 int rc; … … 306 281 uint32_t entry_inode = ext4_directory_entry_ll_get_inode(it.current); 307 282 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); 308 285 309 286 if ((entry_inode == 0) && (rec_len >= required_len)) { … … 320 297 fs->superblock, it.current); 321 298 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);324 299 325 300 if (free_space >= required_len) { … … 388 363 } 389 364 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 390 369 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); 399 375 if (rc != EOK) { 400 376 return rc; 401 377 } 402 378 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; 411 393 } 412 394
Note:
See TracChangeset
for help on using the changeset viewer.