Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset e63ce679 in mainline


Ignore:
Timestamp:
2012-03-03T20:06:31Z (10 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master
Children:
e8d054a
Parents:
7689590
Message:

Some TODOs solved (mostly in error handling)

Location:
uspace
Files:
4 edited

Legend:

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

    r7689590 re63ce679  
    3333/**
    3434 * @file        libext4_balloc.c
    35  * @brief       Block allocator.
     35 * @brief       Physical block allocator.
    3636 */
    3737
     
    370370        }
    371371
     372        // No free block found yet
    372373        block_put(bitmap_block);
    373374        ext4_filesystem_put_block_group_ref(bg_ref);
  • uspace/lib/ext4/libext4_directory_index.c

    r7689590 re63ce679  
    353353        // Hardcoded number 2 means maximum height of index tree !!!
    354354        ext4_directory_dx_block_t dx_blocks[2];
    355         ext4_directory_dx_block_t *dx_block;
     355        ext4_directory_dx_block_t *dx_block, *tmp;
    356356        rc = ext4_directory_dx_get_leaf(&hinfo, fs, inode_ref->inode, root_block, &dx_block, dx_blocks);
    357357        if (rc != EOK) {
     
    367367        rc = ext4_filesystem_get_inode_data_block_index(fs, inode_ref->inode, leaf_block_idx, &leaf_block_addr);
    368368        if (rc != EOK) {
    369                 return EXT4_ERR_BAD_DX_DIR;
     369                goto cleanup;
    370370        }
    371371
     
    373373                rc = block_get(&leaf_block, fs->device, leaf_block_addr, BLOCK_FLAGS_NONE);
    374374                if (rc != EOK) {
    375                         return EXT4_ERR_BAD_DX_DIR;
     375                        goto cleanup;
    376376                }
    377377
    378378                ext4_directory_entry_ll_t *res_dentry;
    379379                rc = ext4_directory_find_in_block(leaf_block, fs->superblock, name_len, name, &res_dentry);
    380 
    381380
    382381                // Found => return it
     
    387386                }
    388387
     388                // Not found, leave untouched
    389389                block_put(leaf_block);
    390390
    391                 // ERROR - corrupted index
    392                 if (rc == -1) {
    393                         // TODO cleanup
    394                         return EXT4_ERR_BAD_DX_DIR;
     391                if (rc != ENOENT) {
     392                        goto cleanup;
    395393                }
    396394
    397395                rc = ext4_directory_dx_next_block(fs, inode_ref->inode, hinfo.hash, dx_block, &dx_blocks[0]);
    398396                if (rc < 0) {
    399                         // TODO cleanup
    400                         return EXT4_ERR_BAD_DX_DIR;
     397                        goto cleanup;
    401398                }
    402399
     
    404401
    405402        return ENOENT;
     403
     404cleanup:
     405
     406        tmp = dx_blocks;
     407        while (tmp <= dx_block) {
     408                block_put(tmp->block);
     409                ++tmp;
     410        }
     411        return rc;
    406412}
    407413
     
    605611{
    606612        int rc = EOK;
    607         int rc2;
     613        int rc2 = EOK;
    608614
    609615        // get direct block 0 (index root)
     
    630636        // Hardcoded number 2 means maximum height of index tree !!!
    631637        ext4_directory_dx_block_t dx_blocks[2];
    632         ext4_directory_dx_block_t *dx_block;
     638        ext4_directory_dx_block_t *dx_block, *dx_it;
    633639        rc = ext4_directory_dx_get_leaf(&hinfo, fs, parent->inode, root_block, &dx_block, dx_blocks);
    634640        if (rc != EOK) {
    635                 block_put(root_block);
    636                 return EXT4_ERR_BAD_DX_DIR;
     641                rc = EXT4_ERR_BAD_DX_DIR;
     642                goto release_index;
    637643        }
    638644
     
    643649        rc = ext4_filesystem_get_inode_data_block_index(fs, parent->inode, leaf_block_idx, &leaf_block_addr);
    644650        if (rc != EOK) {
    645                 return EXT4_ERR_BAD_DX_DIR;
     651                goto release_index;
    646652        }
    647653
     
    650656        rc = block_get(&target_block, fs->device, leaf_block_addr, BLOCK_FLAGS_NONE);
    651657        if (rc != EOK) {
    652                 return EXT4_ERR_BAD_DX_DIR;
     658                goto release_index;
    653659        }
    654660
    655661        rc = ext4_directory_try_insert_entry(fs->superblock, target_block, child, name, name_len);
    656662        if (rc == EOK) {
    657                 goto cleanup;
    658 
     663                goto release_target_index;
    659664        }
    660665
     
    679684                if ((levels > 0) && (root_limit == root_count)) {
    680685                        EXT4FS_DBG("Directory index is full");
    681 
    682                         // ENOSPC - cleanup !!!
    683                         return ENOSPC;
     686                        rc = ENOSPC;
     687                        goto release_target_index;
    684688                }
    685689
     
    688692                rc =  ext4_directory_append_block(fs, parent, &new_fblock, &new_iblock);
    689693                if (rc != EOK) {
    690                         goto cleanup;
     694                        goto release_target_index;
    691695                }
    692696
     
    695699                rc = block_get(&new_block, fs->device, new_fblock, BLOCK_FLAGS_NOREAD);
    696700                if (rc != EOK) {
    697                         goto cleanup;
     701                        goto release_target_index;
    698702                }
    699703
     
    772776        rc = ext4_directory_dx_split_data(fs, parent, &hinfo, target_block, dx_block, &new_block);
    773777        if (rc != EOK) {
    774                 // TODO error
     778                rc2 = rc;
     779                goto release_target_index;
    775780        }
    776781
     
    788793
    789794
     795// TODO check rc handling
    790796terminate:
    791797        rc = block_put(new_block);
     
    795801
    796802
    797 cleanup:
     803release_target_index:
    798804
    799805        rc2 = rc;
     
    804810        }
    805811
    806         ext4_directory_dx_block_t *dx_it = dx_blocks;
     812release_index:
     813        dx_it = dx_blocks;
    807814
    808815        while (dx_it <= dx_block) {
  • uspace/lib/ext4/libext4_filesystem.c

    r7689590 re63ce679  
    3333/**
    3434 * @file        libext4_filesystem.c
    35  * @brief       TODO
     35 * @brief       More complex filesystem operations.
    3636 */
    3737
     
    348348                rc = block_get(&block, fs->device, fblock, BLOCK_FLAGS_NONE);
    349349                if (rc != EOK) {
    350                         // TODO error
     350                        return rc;
    351351                }
    352352
     
    358358                                rc = ext4_balloc_free_block(fs, inode_ref, ind_block);
    359359                                if (rc != EOK) {
    360                                         // TODO error
     360                                        block_put(block);
     361                                        return rc;
    361362                                }
    362363                        }
     
    366367                rc = ext4_balloc_free_block(fs, inode_ref, fblock);
    367368                if (rc != EOK) {
    368                         // TODO error
     369                        return rc;
    369370                }
    370371
     
    379380                rc = block_get(&block, fs->device, fblock, BLOCK_FLAGS_NONE);
    380381                if (rc != EOK) {
    381                         // TODO error
     382                        return rc;
    382383                }
    383384
     
    389390                                rc = block_get(&subblock, fs->device, ind_block, BLOCK_FLAGS_NONE);
    390391                                if (rc != EOK) {
    391                                         // TODO error
     392                                        block_put(block);
     393                                        return rc;
    392394                                }
    393395
     
    399401                                                rc = ext4_balloc_free_block(fs, inode_ref, ind_subblock);
    400402                                                if (rc != EOK) {
    401                                                         // TODO error
     403                                                        block_put(subblock);
     404                                                        block_put(block);
     405                                                        return rc;
    402406                                                }
    403407                                        }
     
    410414                        rc = ext4_balloc_free_block(fs, inode_ref, ind_block);
    411415                        if (rc != EOK) {
    412                                 // TODO error
     416                                block_put(block);
     417                                return rc;
    413418                        }
    414419
     
    419424                rc = ext4_balloc_free_block(fs, inode_ref, fblock);
    420425                if (rc != EOK) {
    421                         // TODO error
     426                        return rc;
    422427                }
    423428
     
    613618        }
    614619
    615 
    616 
    617620        uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
    618621
     
    628631                rc = ext4_balloc_alloc_block(fs, inode_ref, &new_block_addr);
    629632                if (rc != EOK) {
    630                         // TODO error
    631                         EXT4FS_DBG("error in allocation");
     633                        return rc;
    632634                }
    633635
     
    638640                rc = block_get(&new_block, fs->device, new_block_addr, BLOCK_FLAGS_NOREAD);
    639641                if (rc != EOK) {
    640                         EXT4FS_DBG("block load error");
    641                         // TODO error
     642                        ext4_balloc_free_block(fs, inode_ref, new_block_addr);
     643                        return rc;
    642644                }
    643645
     
    647649                rc = block_put(new_block);
    648650                if (rc != EOK) {
    649                         EXT4FS_DBG("block put error");
    650                 }
    651 
    652 //              EXT4FS_DBG("allocated indirect block for level \%u, during setting iblock \%u", level, (uint32_t)iblock);
     651                        return rc;
     652                }
    653653
    654654                current_block = new_block_addr;
     
    670670                        rc = ext4_balloc_alloc_block(fs, inode_ref, &new_block_addr);
    671671                        if (rc != EOK) {
    672                                 // TODO error
    673                                 EXT4FS_DBG("allocation error");
     672                                block_put(block);
     673                                return rc;
    674674                        }
    675675
    676676                        rc = block_get(&new_block, fs->device, new_block_addr, BLOCK_FLAGS_NOREAD);
    677677                        if (rc != EOK) {
    678                                 // TODO error
    679 
    680                                 EXT4FS_DBG("BBB: error block loading");
    681 
     678                                block_put(block);
     679                                return rc;
    682680                        }
     681
    683682                        memset(new_block->data, 0, block_size);
    684683                        new_block->dirty = true;
     
    686685                        rc = block_put(new_block);
    687686                        if (rc != EOK) {
    688                                 EXT4FS_DBG("BBB: error indirect block saving");
     687                                block_put(block);
     688                                return rc;
    689689                        }
    690690
  • uspace/srv/fs/ext4fs/ext4fs_ops.c

    r7689590 re63ce679  
    10921092        rc = ext4_filesystem_get_inode_data_block_index(fs, inode_ref->inode, iblock, &fblock);
    10931093        if (rc != EOK) {
    1094                 // TODO error
    10951094                ext4fs_node_put(fn);
    1096                 EXT4FS_DBG("error loading block addr");
     1095                async_answer_0(callid, rc);
    10971096                return rc;
    10981097        }
Note: See TracChangeset for help on using the changeset viewer.