[go: up one dir, main page]

Menu

[r1]: / ext2 / bitmap.c  Maximize  Restore  History

Download this file

148 lines (132 with data), 4.3 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "ext2.h"
#include "bitmap.h"
#include "cache.h"
extern struct ext2_fs fs;
/*
* 修改bitmap, 保留块组(group) 里面的super block backup
* group desc blocks backup, block bitmap, inode bitmap
* inode table
* 返回除去这些块以外改块组中的剩余块(空块)数目
*/
long reserve_super_and_bgd(long group)
{
int i;
long block;
long cnt = 0;
/* 保留启动块 */
/*
if(group == 0 && fs.super_i->s_es->s_first_data_block != 0)
{
_bitmap_block_used(group, 0);
cnt++;
}
*/
/* 保留超级块 */
block = fs.super_i->s_es->s_first_data_block + group * fs.super_i->s_blocks_per_group;
_bitmap_block_used(group, block);
cnt++;
/* 保留组描述符所使用的块 */
block++;
for(i = 0; i < fs.super_i->s_gdb_count; i++)
{
_bitmap_block_used(group, block + i);
}
cnt += i;
/* 保留数据块位图所使用的(1)块 */
block += i;
_bitmap_block_used(group, block);
cnt++;
/* 保留inode位图所使用的(1)块 */
block++;
_bitmap_block_used(group, block);
cnt++;
/* 保留inode table所使用的块 */
block++;
for(i = 0; i < fs.super_i->s_itb_per_group; i++)
{
_bitmap_block_used(group, block + i);
}
cnt += i;
if(group == fs.super_i->s_groups_count - 1)
{
//padding at the end of the last group block bitmap
long tmp;
tmp = fs.super_i->s_es->s_blocks_count
- fs.super_i->s_es->s_first_data_block
- group * fs.super_i->s_blocks_per_group;
block = fs.super_i->s_es->s_first_data_block + group * fs.super_i->s_blocks_per_group;
for(i = 0; i < fs.super_i->s_blocks_per_group - tmp; i++)
{
_bitmap_block_used(group, block + i + tmp);
cnt++;
}
}
return fs.super_i->s_frags_per_group - cnt;
}
void _bitmap_block_used(long group, long block)
{
unsigned char *buf;
long block_in_group;
read_group_block_bitmap(group, &buf);
block_in_group = block - fs.super_i->s_es->s_first_data_block
- group * fs.super_i->s_blocks_per_group;
buf[block_in_group / 8] |= (1 << (block_in_group % 8));
write_group_block_bitmap(group, 0);
//fs.group_desc_cache.cache.group_desc[group].bg_free_blocks_count--;
//fs.super_i->s_es->s_free_blocks_count--;
}
void bitmap_block_used(long group, long block)
{
unsigned char *buf;
long block_in_group;
read_group_block_bitmap(group, &buf);
block_in_group = block - fs.super_i->s_es->s_first_data_block
- group * fs.super_i->s_blocks_per_group;
buf[block_in_group / 8] |= (1 << (block_in_group % 8));
write_group_block_bitmap(group, 0);
fs.group_desc_cache.cache.group_desc[group].bg_free_blocks_count--;
fs.super_i->s_es->s_free_blocks_count--;
}
void bitmap_block_unused(long group, long block)
{
unsigned char *buf;
long block_in_group;
read_group_block_bitmap(group, &buf);
block_in_group = block - fs.super_i->s_es->s_first_data_block
- group * fs.super_i->s_blocks_per_group;
buf[block_in_group / 8] &= ~(1 << (block_in_group % 8));
write_group_block_bitmap(group, 0);
fs.group_desc_cache.cache.group_desc[group].bg_free_blocks_count++;
fs.super_i->s_es->s_free_blocks_count++;
}
void bitmap_inode_used(long group, long inode)
{
unsigned char *buf;
long inode_in_group;
read_group_inode_bitmap(group, &buf);
inode_in_group = inode - group * fs.super_i->s_inodes_per_group - 1;
buf[inode_in_group / 8] |= (1 << (inode_in_group % 8));
write_group_inode_bitmap(group, 0);
fs.group_desc_cache.cache.group_desc[group].bg_free_inodes_count--;
fs.super_i->s_es->s_free_inodes_count--;
}
void bitmap_inode_unused(long group, long inode)
{
unsigned char *buf;
long inode_in_group;
read_group_inode_bitmap(group, &buf);
inode_in_group = inode - group * fs.super_i->s_inodes_per_group - 1;
buf[inode_in_group / 8] &= ~(1 << (inode_in_group % 8));
write_group_inode_bitmap(group, 0);
fs.group_desc_cache.cache.group_desc[group].bg_free_inodes_count++;
fs.super_i->s_es->s_free_inodes_count++;
}
int block_stat(long group, long block)
{
unsigned char *buf;
long block_in_group;
read_group_block_bitmap(group, &buf);
block_in_group = block - fs.super_i->s_es->s_first_data_block
- group * fs.super_i->s_blocks_per_group;
return buf[block_in_group / 8] & (1 << (block_in_group % 8));
}