Changeset b3d7277 in mainline
- Timestamp:
- 2011-11-10T09:49:57Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6088193
- Parents:
- 2b9e142
- Location:
- uspace/lib/ext4
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_inode.c
r2b9e142 rb3d7277 41 41 #include "libext4.h" 42 42 43 static 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 43 56 uint32_t ext4_inode_get_mode(ext4_superblock_t *sb, ext4_inode_t *inode) 44 57 { … … 89 102 } 90 103 91 /* 92 extern uint64_t ext4_inode_get_blocks_count(ext4_inode_t *); 93 */ 104 105 uint64_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 128 int 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 } 94 166 95 167 uint32_t ext4_inode_get_flags(ext4_inode_t *inode) { 96 168 return uint32_t_le2host(inode->flags); 169 } 170 171 void ext4_inode_set_flags(ext4_inode_t *inode, uint32_t flags) { 172 inode->flags = host2uint32_t_le(flags); 97 173 } 98 174 … … 189 265 } 190 266 191 // Flags checker267 // Flags operations 192 268 bool ext4_inode_has_flag(ext4_inode_t *inode, uint32_t flag) 193 269 { … … 196 272 } 197 273 return false; 274 } 275 276 void 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 283 void 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); 198 288 } 199 289 -
uspace/lib/ext4/libext4_inode.h
r2b9e142 rb3d7277 163 163 */ 164 164 extern uint16_t ext4_inode_get_links_count(ext4_inode_t *); 165 /* 166 extern uint64_t ext4_inode_get_blocks_count(ext4_inode_t *) 167 */ 165 extern uint64_t ext4_inode_get_blocks_count(ext4_superblock_t *, ext4_inode_t *); 166 extern int ext4_inode_set_blocks_count(ext4_superblock_t *, ext4_inode_t *, uint64_t); 168 167 extern uint32_t ext4_inode_get_flags(ext4_inode_t *); 169 168 void ext4_inode_set_flags(ext4_inode_t *, uint32_t); 170 169 extern uint32_t ext4_inode_get_direct_block(ext4_inode_t *, uint32_t); 171 170 extern void ext4_inode_set_direct_block(ext4_inode_t *, uint32_t, uint32_t); … … 188 187 extern ext4_extent_header_t * ext4_inode_get_extent_header(ext4_inode_t *); 189 188 extern bool ext4_inode_has_flag(ext4_inode_t *, uint32_t); 189 extern void ext4_inode_clear_flag(ext4_inode_t *, uint32_t); 190 extern void ext4_inode_set_flag(ext4_inode_t *, uint32_t); 190 191 extern bool ext4_inode_can_truncate(ext4_superblock_t *, ext4_inode_t *); 191 192
Note:
See TracChangeset
for help on using the changeset viewer.