Changeset 3d4fd2c in mainline for uspace/lib/ext4/libext4_ialloc.c
- Timestamp:
- 2011-11-22T16:56:09Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 82d7816
- Parents:
- bf66ef4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ext4/libext4_ialloc.c
rbf66ef4 r3d4fd2c 36 36 */ 37 37 38 #include <errno.h> 38 39 #include "libext4.h" 40 41 static uint32_t ext4_ialloc_inode2index_in_group(ext4_superblock_t *sb, 42 uint32_t inode) 43 { 44 uint32_t inodes_per_group = ext4_superblock_get_inodes_per_group(sb); 45 return (inode - 1) % inodes_per_group; 46 } 47 48 static uint32_t ext4_ialloc_get_bgid_of_inode(ext4_superblock_t *sb, 49 uint32_t inode) 50 { 51 uint32_t inodes_per_group = ext4_superblock_get_inodes_per_group(sb); 52 return (inode - 1) / inodes_per_group; 53 54 } 55 56 57 int ext4_ialloc_free_inode(ext4_filesystem_t *fs, ext4_inode_ref_t *inode_ref) 58 { 59 int rc; 60 uint32_t block_group = ext4_ialloc_get_bgid_of_inode( 61 fs->superblock, inode_ref->index); 62 uint32_t index_in_group = ext4_ialloc_inode2index_in_group( 63 fs->superblock, inode_ref->index); 64 65 ext4_block_group_ref_t *bg_ref; 66 rc = ext4_filesystem_get_block_group_ref(fs, block_group, &bg_ref); 67 if (rc != EOK) { 68 EXT4FS_DBG("error in loading bg_ref \%d", rc); 69 return rc; 70 } 71 72 uint32_t bitmap_block_addr = ext4_block_group_get_inode_bitmap( 73 bg_ref->block_group, fs->superblock); 74 block_t *bitmap_block; 75 rc = block_get(&bitmap_block, fs->device, bitmap_block_addr, 0); 76 if (rc != EOK) { 77 EXT4FS_DBG("error in loading bitmap \%d", rc); 78 return rc; 79 } 80 81 ext4_bitmap_free_bit(bitmap_block->data, index_in_group); 82 bitmap_block->dirty = true; 83 84 rc = block_put(bitmap_block); 85 if (rc != EOK) { 86 // Error in saving bitmap 87 ext4_filesystem_put_block_group_ref(bg_ref); 88 EXT4FS_DBG("error in saving bitmap \%d", rc); 89 return rc; 90 } 91 92 // Update superblock free inodes count 93 uint32_t sb_free_inodes = ext4_superblock_get_free_inodes_count(fs->superblock); 94 sb_free_inodes--; 95 ext4_superblock_set_free_inodes_count(fs->superblock, sb_free_inodes); 96 97 // Update block group free inodes count 98 uint32_t free_inodes = ext4_block_group_get_free_inodes_count( 99 bg_ref->block_group, fs->superblock); 100 free_inodes++; 101 ext4_block_group_set_free_inodes_count(bg_ref->block_group, 102 fs->superblock, free_inodes); 103 bg_ref->dirty = true; 104 105 rc = ext4_filesystem_put_block_group_ref(bg_ref); 106 if (rc != EOK) { 107 EXT4FS_DBG("error in saving bg_ref \%d", rc); 108 // TODO error 109 return rc; 110 } 111 112 return EOK; 113 } 39 114 40 115
Note:
See TracChangeset
for help on using the changeset viewer.