Changeset b3d7277 in mainline


Ignore:
Timestamp:
2011-11-10T09:49:57Z (13 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6088193
Parents:
2b9e142
Message:

getter and setter for inode blocks count

Location:
uspace/lib/ext4
Files:
2 edited

Legend:

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

    r2b9e142 rb3d7277  
    4141#include "libext4.h"
    4242
     43static uint32_t ext4_inode_block_bits_count(uint32_t block_size)
     44{
     45        uint32_t bits = 8;
     46        uint32_t size = block_size;
     47
     48        do {
     49                bits++;
     50                size = size >> 1;
     51        } while (size > 256);
     52
     53        return bits;
     54}
     55
    4356uint32_t ext4_inode_get_mode(ext4_superblock_t *sb, ext4_inode_t *inode)
    4457{
     
    89102}
    90103
    91 /*
    92 extern uint64_t ext4_inode_get_blocks_count(ext4_inode_t *);
    93 */
     104
     105uint64_t ext4_inode_get_blocks_count(ext4_superblock_t *sb, ext4_inode_t *inode)
     106{
     107        uint64_t count;
     108
     109        if (ext4_superblock_has_feature_read_only(sb, EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) {
     110
     111                /* 48-bit field */
     112                count = ((uint64_t)uint16_t_le2host(inode->osd2.linux2.blocks_high)) << 32 |
     113                                uint32_t_le2host(inode->blocks_count_lo);
     114
     115                if (ext4_inode_has_flag(inode, EXT4_INODE_FLAG_HUGE_FILE)) {
     116                uint32_t block_size = ext4_superblock_get_block_size(sb);
     117                uint32_t block_bits = ext4_inode_block_bits_count(block_size);
     118                        return count  << (block_bits - 9);
     119                } else {
     120                        return count;
     121                }
     122        } else {
     123                return uint32_t_le2host(inode->blocks_count_lo);
     124    }
     125
     126}
     127
     128int ext4_inode_set_blocks_count(ext4_superblock_t *sb, ext4_inode_t *inode,
     129                uint64_t count)
     130{
     131    // 32-bit maximum
     132    uint64_t max = 0;
     133    max = ~max >> 32;
     134
     135    if (count <= max) {
     136        inode->blocks_count_lo = host2uint32_t_le(count);
     137        inode->osd2.linux2.blocks_high = 0;
     138        ext4_inode_clear_flag(inode, EXT4_INODE_FLAG_HUGE_FILE);
     139        return EOK;
     140    }
     141
     142    if (!ext4_superblock_has_feature_read_only(sb, EXT4_FEATURE_RO_COMPAT_HUGE_FILE)) {
     143        return EINVAL;
     144    }
     145
     146    // 48-bit maximum
     147    max = 0;
     148    max = ~max >> 16;
     149
     150    if (count <= max) {
     151        inode->blocks_count_lo = host2uint32_t_le(count);
     152        inode->osd2.linux2.blocks_high = host2uint16_t_le(count >> 32);
     153        ext4_inode_clear_flag(inode, EXT4_INODE_FLAG_HUGE_FILE);
     154    } else {
     155        uint32_t block_size = ext4_superblock_get_block_size(sb);
     156        uint32_t block_bits = ext4_inode_block_bits_count(block_size);
     157        ext4_inode_set_flag(inode, EXT4_INODE_FLAG_HUGE_FILE);
     158        count = count >> (block_bits - 9);
     159        inode->blocks_count_lo = host2uint32_t_le(count);
     160        inode->osd2.linux2.blocks_high = host2uint16_t_le(count >> 32);
     161    }
     162    return EOK;
     163
     164
     165}
    94166
    95167uint32_t ext4_inode_get_flags(ext4_inode_t *inode) {
    96168        return uint32_t_le2host(inode->flags);
     169}
     170
     171void ext4_inode_set_flags(ext4_inode_t *inode, uint32_t flags) {
     172        inode->flags = host2uint32_t_le(flags);
    97173}
    98174
     
    189265}
    190266
    191 // Flags checker
     267// Flags operations
    192268bool ext4_inode_has_flag(ext4_inode_t *inode, uint32_t flag)
    193269{
     
    196272        }
    197273        return false;
     274}
     275
     276void ext4_inode_clear_flag(ext4_inode_t *inode, uint32_t clear_flag)
     277{
     278        uint32_t flags = ext4_inode_get_flags(inode);
     279        flags = flags & (~clear_flag);
     280        ext4_inode_set_flags(inode, flags);
     281}
     282
     283void ext4_inode_set_flag(ext4_inode_t *inode, uint32_t set_flag)
     284{
     285        uint32_t flags = ext4_inode_get_flags(inode);
     286        flags = flags | set_flag;
     287        ext4_inode_set_flags(inode, flags);
    198288}
    199289
  • uspace/lib/ext4/libext4_inode.h

    r2b9e142 rb3d7277  
    163163*/
    164164extern uint16_t ext4_inode_get_links_count(ext4_inode_t *);
    165 /*
    166 extern uint64_t ext4_inode_get_blocks_count(ext4_inode_t *)
    167 */
     165extern uint64_t ext4_inode_get_blocks_count(ext4_superblock_t *, ext4_inode_t *);
     166extern int ext4_inode_set_blocks_count(ext4_superblock_t *, ext4_inode_t *, uint64_t);
    168167extern uint32_t ext4_inode_get_flags(ext4_inode_t *);
    169 
     168void ext4_inode_set_flags(ext4_inode_t *, uint32_t);
    170169extern uint32_t ext4_inode_get_direct_block(ext4_inode_t *, uint32_t);
    171170extern void ext4_inode_set_direct_block(ext4_inode_t *, uint32_t, uint32_t);
     
    188187extern ext4_extent_header_t * ext4_inode_get_extent_header(ext4_inode_t *);
    189188extern bool ext4_inode_has_flag(ext4_inode_t *, uint32_t);
     189extern void ext4_inode_clear_flag(ext4_inode_t *, uint32_t);
     190extern void ext4_inode_set_flag(ext4_inode_t *, uint32_t);
    190191extern bool ext4_inode_can_truncate(ext4_superblock_t *, ext4_inode_t *);
    191192
Note: See TracChangeset for help on using the changeset viewer.