Changeset 8958a26 in mainline for uspace/lib/ext4


Ignore:
Timestamp:
2011-10-11T19:06:10Z (14 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/lib/ext4
Files:
4 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
Note: See TracChangeset for help on using the changeset viewer.