#include <stdio.h> #include <stdlib.h> #include <string.h> #include "ext2sim.h" extern S_SUPERBLOCK superblock; extern FS_INFO info; extern S_GROUP_DESCRIPTOR group_desc[MAX_GROUPS]; char *block_bitmap; char *inode_bitmap; char bitmaps_initialised; int initialise_bitmaps(void) { if(bitmaps_initialised) deinitialise_bitmaps(); block_bitmap=(char *)malloc(superblock.s_blocks_per_group); inode_bitmap=(char *)malloc(superblock.s_inodes_per_group); bitmaps_initialised=1; clear_bitmaps(); return 0; } void deinitialise_bitmaps(void) { if(!bitmaps_initialised) return; free(block_bitmap); free(inode_bitmap); bitmaps_initialised=0; } void clear_bitmaps(void) { if(!bitmaps_initialised) return; memset(block_bitmap,0,superblock.s_blocks_per_group); memset(inode_bitmap,0,superblock.s_inodes_per_group); } int write_bitmaps(int num) { unsigned char *buf; int i,r; buf=(unsigned char *)malloc(info.block_size); memset(buf,0,info.block_size); for(i=0;i<superblock.s_inodes_per_group;i++){ if((i>>3)>=info.block_size){ free(buf); return -1; } buf[i>>3]+=(inode_bitmap[i]<<(i&7)); r=(i>>3)+1; } r=write_block(group_desc[num].bg_inode_bitmap,r,buf); if(r!=0){ free(buf); return r; } memset(buf,0,info.block_size); for(i=0;i<superblock.s_blocks_per_group;i++){ if((i>>3)>=info.block_size){ free(buf); return -1; } buf[i>>3]+=(block_bitmap[i]<<(i&7)); if(block_bitmap[i]!=0) printf("ale je %d = %d, %d\n",i,buf[i>>3],block_bitmap[i]); r=(i>>3)+1; } r=write_block(group_desc[num].bg_block_bitmap,r,buf); if(r!=0){ free(buf); return r; } free(buf); return 0; } int read_bitmaps(int num) { unsigned char *buf; int i,r; buf=(unsigned char *)malloc(info.block_size); memset(buf,0,info.block_size); r=read_block(group_desc[num].bg_inode_bitmap,info.block_size,buf); if(r!=0){ free(buf); return r; } for(i=0;i<superblock.s_inodes_per_group;i++){ if((i>>3)>=info.block_size){ free(buf); return -1; } inode_bitmap[i]=!(!(buf[i>>3]&(1<<(i&7)))); } memset(buf,0,info.block_size); r=read_block(group_desc[num].bg_block_bitmap,info.block_size,buf); if(r!=0){ free(buf); return r; } for(i=0;i<superblock.s_blocks_per_group;i++){ if((i>>3)>=info.block_size){ free(buf); return -1; } block_bitmap[i]=!(!(buf[i>>3]&(1<<(i&7)))); // if(block_bitmap[i]!=0) printf("%d: zle je %d\n",num,buf[i>>3]); } free(buf); return 0; }