#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "ext2sim.h" extern S_SUPERBLOCK superblock; extern FS_INFO info; extern S_GROUP_DESCRIPTOR group_desc[MAX_GROUPS]; extern char *block_bitmap; extern char *inode_bitmap; int check(void) { int i,a,r,j; int free_block_count; int free_inodes_count; if(superblock.s_inodes_count<1){ printf("Check: s_inodes_count is too small!\n"); return -1; } if(superblock.s_block_count<1){ printf("Check: s_block_count is too small!\n"); return -1; } if(superblock.s_r_blocks_count>superblock.s_block_count){ printf("Check: s_r_blocks_count is to much!\n"); return -1; } if(superblock.s_free_blocks_count>superblock.s_block_count){ printf("Check: s_free_blocks_count is bigger than s_block_count!\n"); return -1; } if(superblock.s_free_inodes_count>superblock.s_inodes_count){ printf("Check: s_free_blocks_count is bigger than s_block_count!\n"); return -1; } if(superblock.s_log_block_size==0&&superblock.s_first_data_block!=1){ printf("Check: s_first_data_block is incorrect!\n"); return -1; } if(superblock.s_log_block_size!=0&&superblock.s_first_data_block!=0){ printf("Check: s_first_data_block is incorrect!\n"); return -1; } if(superblock.s_log_block_size>4){ printf("Check: s_log_block_size is too big!\n"); return -1; } if(superblock.s_magic!=0xEF53){ printf("Check: incorrect s_magic value!\n"); return -1; } if(superblock.s_inode_size!=128){ printf("Check: s_inode_size should be 128\n"); return -1; } for(i=0;i<16;i++) if(superblock.s_volume_name[i]==0) break; if(i==16){ printf("Check: bad s_volume_name!\n"); return -1; } free_block_count=superblock.s_free_blocks_count; free_inodes_count=superblock.s_free_inodes_count; a=superblock.s_first_data_block; //zac. 1. grupy for(i=0;i<info.group_count;i++){ a=superblock.s_blocks_per_group*i+superblock.s_first_data_block; r=group_desc[i].bg_block_bitmap; //zac. block bitmapu danej grupy // printf("Groupa %d : bg_inode_table = %d\n",i,group_desc[i].bg_inode_table); // printf("Groupa %d : start = %d\n",i,a); if(r<a){ printf("Check: Group %d has bad bg_block_bitmap address! %d,%d\n",i,r,a); return -1; } a=r+1; r=group_desc[i].bg_inode_bitmap; if(r!=a){ printf("Check: Group %d has bad bg_inode_bitmap address!\n",i); return -1; } a=r+1; r=group_desc[i].bg_inode_table; if(r<a){ printf("Check: Group %d has bad bg_inode_table address!\n",i); return -1; } free_block_count-=group_desc[i].bg_free_block_count; if(free_block_count<0){ printf("Check: Group %d has bad bg_free_block_count!\n",i); return -1; } free_inodes_count-=group_desc[i].bg_free_inodes_count; if(free_inodes_count<0){ printf("Check: Group %d has bad bg_free_inodes_count!\n",i); return -1; } read_bitmaps(i); //block bmp vs. gr. desc. r=0; for(j=0;j<superblock.s_blocks_per_group;j++){ if(block_bitmap[j]==0) r++; } if(r!=group_desc[i].bg_free_block_count){ printf("Check: Group %d has wrong bg_free_block_count in association with block_bitmap %d!=%d !\n",i,r,group_desc[i].bg_free_block_count); return -1; } r=0; for(j=0;j<superblock.s_inodes_per_group;j++){ if(inode_bitmap[j]==0) r++; } if(r!=group_desc[i].bg_free_inodes_count){ printf("Check: Group %d has wrong bg_free_inodes_count in association with inode_bitmap!\n",i); return -1; } } if(free_block_count!=0){ printf("Check: Free blocks count from superblock and groups differs.\n"); return -1; } if(free_inodes_count!=0){ printf("Check: Free inodes count from superblock and groups differs.\n"); return -1; } printf("Check: Everything seems to be OK.\n"); return 0; }