Changeset 1e65444 in mainline for uspace/lib/ext4/libext4_bitmap.c
- Timestamp:
- 2011-11-09T17:52:33Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2b9e142
- Parents:
- 35f48f2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_bitmap.c
r35f48f2 r1e65444 43 43 static void ext4_bitmap_free_bit(uint8_t *bitmap, uint32_t index) 44 44 { 45 // Block numbers are 1-based 45 46 uint32_t byte_index = index / 8; 46 47 uint32_t bit_index = index % 8; 48 49 // EXT4FS_DBG("freeing block \%u, byte \%u and bit \%u", index, byte_index, bit_index); 47 50 48 51 uint8_t *target = bitmap + byte_index; … … 59 62 int i; 60 63 uint32_t idx = 0; 64 uint8_t value, new_value; 61 65 62 66 while (pos < bitmap + size) { … … 72 76 if (pos < bitmap + size) { 73 77 78 // EXT4FS_DBG("byte found \%u", (uint32_t)(pos - bitmap)); 79 74 80 for(i = 0; i < 8; ++i) { 75 if ((*pos & (1 << i)) == 0) { 81 value = *pos; 82 83 if ((value & (1 << i)) == 0) { 76 84 // free bit found 77 *pos |= (1 << i); 78 *index = idx; 85 // EXT4FS_DBG("bit found \%u", i); 86 new_value = value | (1 << i); 87 *pos = new_value; 88 *index = idx + i; 79 89 return EOK; 80 90 } 81 82 idx++;83 91 } 84 92 } … … 98 106 99 107 blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock); 100 block_group = block_index / blocks_per_group;101 index_in_group = block_index% blocks_per_group;108 block_group = ((block_index - 1) / blocks_per_group); 109 index_in_group = (block_index - 1) % blocks_per_group; 102 110 103 111 rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref); … … 133 141 return rc; 134 142 } 143 144 EXT4FS_DBG("block \%u released", block_index); 135 145 136 146 return EOK; … … 148 158 149 159 inodes_per_group = ext4_superblock_get_inodes_per_group(fs->superblock); 150 block_group = inode_ref->index/ inodes_per_group;160 block_group = (inode_ref->index - 1) / inodes_per_group; 151 161 152 162 block_size = ext4_superblock_get_block_size(fs->superblock); … … 166 176 167 177 rc = ext4_bitmap_find_free_bit_and_set(block->data, &rel_block_idx, block_size); 168 169 170 178 if (rc != EOK) { 171 179 EXT4FS_DBG("no block found"); 172 180 // TODO if ENOSPC - try next block group - try next block groups 173 181 } 182 183 block->dirty = true; 184 185 // TODO check retval 186 block_put(block); 174 187 175 188 // TODO decrement superblock free blocks count … … 179 192 180 193 uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group); 181 bg_free_blocks ++;194 bg_free_blocks--; 182 195 ext4_block_group_set_free_blocks_count(bg_ref->block_group, bg_free_blocks); 183 196 bg_ref->dirty = true; 184 197 185 // return 198 ext4_filesystem_put_block_group_ref(bg_ref); 199 186 200 blocks_per_group = ext4_superblock_get_blocks_per_group(fs->superblock); 187 *fblock = blocks_per_group * block_group + rel_block_idx; 201 202 EXT4FS_DBG("block \%u allocated", blocks_per_group * block_group + rel_block_idx + 1); 203 204 *fblock = blocks_per_group * block_group + rel_block_idx + 1; 188 205 return EOK; 189 206
Note:
See TracChangeset
for help on using the changeset viewer.