Changeset 3d4fd2c in mainline for uspace/lib/ext4/libext4_ialloc.c


Ignore:
Timestamp:
2011-11-22T16:56:09Z (12 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
82d7816
Parents:
bf66ef4
Message:

deleting regular files (directories is not debugged)

File:
1 edited

Legend:

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

    rbf66ef4 r3d4fd2c  
    3636 */
    3737
     38#include <errno.h>
    3839#include "libext4.h"
     40
     41static 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
     48static 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
     57int 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}
    39114
    40115
Note: See TracChangeset for help on using the changeset viewer.