Changeset 8958a26 in mainline


Ignore:
Timestamp:
2011-10-11T19:06:10Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1a7756a
Parents:
acd869e
Message:

Extent reading (only with zero depth)

Location:
uspace
Files:
5 edited

Legend:

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

    racd869e r8958a26  
    3939#include "libext4_extent.h"
    4040
     41uint32_t ext4_extent_get_first_block(ext4_extent_t *extent)
     42{
     43        return uint32_t_le2host(extent->first_block);
     44}
     45
     46uint16_t ext4_extent_get_block_count(ext4_extent_t *extent)
     47{
     48        return uint16_t_le2host(extent->block_count);
     49}
     50
     51uint64_t ext4_extent_get_start(ext4_extent_t *extent)
     52{
     53        return ((uint64_t)uint16_t_le2host(extent->start_hi)) << 32 |
     54                        ((uint64_t)uint32_t_le2host(extent->start_lo));
     55
     56}
     57
    4158uint16_t ext4_extent_header_get_magic(ext4_extent_header_t *header)
    4259{
  • uspace/lib/ext4/libext4_extent.h

    racd869e r8958a26  
    6969
    7070#define EXT4_EXTENT_MAGIC       0xF30A
     71#define EXT4_EXTENT_FIRST(header)       \
     72                ((ext4_extent_t *) (((void *) (header)) + sizeof(ext4_extent_header_t)))
     73
     74extern uint32_t ext4_extent_get_first_block(ext4_extent_t *);
     75extern uint16_t ext4_extent_get_block_count(ext4_extent_t *);
     76extern uint64_t ext4_extent_get_start(ext4_extent_t *);
    7177
    7278extern uint16_t ext4_extent_header_get_magic(ext4_extent_header_t *);
  • uspace/lib/ext4/libext4_filesystem.c

    racd869e r8958a26  
    301301        block_t *block;
    302302
    303         // TODO extents
     303        /* Handle inode using extents */
     304        // TODO check "extents" feature in superblock ???
    304305        if (ext4_inode_has_flag(inode, EXT4_INODE_FLAG_EXTENTS)) {
    305                 EXT4FS_DBG("Inode contains Extent");
    306                 // TODO
    307                 /*
    308306                current_block = ext4_inode_get_extent_block(inode, iblock);
    309307                *fblock = current_block;
    310308                return EOK;
    311                 */
    312309
    313310        }
  • uspace/lib/ext4/libext4_inode.c

    racd869e r8958a26  
    104104uint32_t ext4_inode_get_extent_block(ext4_inode_t *inode, uint64_t idx)
    105105{
    106         //ext4_extent_header_t *header = ext4_inode_get_extent_header(inode);
    107         // TODO search required block
     106        ext4_extent_header_t *header = ext4_inode_get_extent_header(inode);
     107
     108        if (ext4_extent_header_get_depth(header) == 0) {
     109
     110                ext4_extent_t *extent = EXT4_EXTENT_FIRST(header);
     111
     112                // TODO more effective searching?
     113                for (uint16_t i = 0; i < ext4_extent_header_get_entries_count(header); ++i) {
     114
     115                        uint32_t first = ext4_extent_get_first_block(extent);
     116                        uint16_t count = ext4_extent_get_block_count(extent);
     117                        uint64_t block = 0;
     118
     119                        if ((idx >= first) && (idx < first + count)) {
     120                                block = ext4_extent_get_start(extent) + idx;
     121                                block -= ext4_extent_get_first_block(extent);
     122                                return block;
     123                        }
     124                        // Go to the next extent
     125                        ++extent;
     126                }
     127        }
     128
     129        // TODO binary search for depth > 0
     130        EXT4FS_DBG("NOT IMPLEMENTED !!!");
    108131        return 0;
    109132
  • uspace/srv/fs/ext4fs/ext4fs_ops.c

    racd869e r8958a26  
    718718
    719719        ext4_filesystem_put_inode_ref(inode_ref);
     720
    720721        return rc;
    721722}
    722723
    723 bool ext4fs_is_dots(const uint8_t *name, size_t name_size) {
     724bool ext4fs_is_dots(const uint8_t *name, size_t name_size)
     725{
    724726        if (name_size == 1 && name[0] == '.') {
    725727                return true;
     
    745747
    746748        // TODO check if directory uses HTree
    747         if (ext4_filesystem_has_feature_compatible(inst->filesystem, EXT4_FEATURE_COMPAT_DIR_INDEX)
    748                         && ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_INDEX)) {
     749        if (ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_INDEX)) {
    749750                EXT4FS_DBG("Directory using HTree");
    750751        }
     
    802803        if (found) {
    803804                rc = ext4_directory_iterator_next(&it);
    804                 if (rc != EOK)
     805                if (rc != EOK) {
    805806                        return rc;
     807                }
    806808                next = it.current_offset;
    807809        }
    808810
    809811        rc = ext4_directory_iterator_fini(&it);
    810         if (rc != EOK)
    811                 return rc;
     812        if (rc != EOK) {
     813                return rc;
     814        }
    812815
    813816        if (found) {
     
    832835        block_t *block;
    833836        uint8_t *buffer;
    834 
    835         // TODO Check extent
    836         if (ext4_filesystem_has_feature_incompatible(inst->filesystem, EXT4_FEATURE_INCOMPAT_EXTENTS)
    837                         && ext4_inode_has_flag(inode_ref->inode, EXT4_INODE_FLAG_EXTENTS)) {
    838                 EXT4FS_DBG("Extent found");
    839         }
    840837
    841838        file_size = ext4_inode_get_size(inst->filesystem->superblock,
     
    901898
    902899        rc = block_put(block);
    903         if (rc != EOK)
    904                 return rc;
     900        if (rc != EOK) {
     901                return rc;
     902        }
    905903
    906904        *rbytes = bytes;
Note: See TracChangeset for help on using the changeset viewer.