#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 format(int group_count,int block_shift) { int size,i,r; int inode_count; int blocks_count; int inode_table_size; int block_size; char tmp[16]; if(group_count<1){ printf("Group count must be at least 1!\n"); return 1; } if(group_count>MAX_GROUPS){ printf("Group count must be maximalne %d!\n",MAX_GROUPS); return 1; } if(block_shift<0||block_shift>4){ printf("Bad block shitft size!\n"); return 1; } block_size=1024<<block_shift; inode_count=(block_size/1024)*1712; inode_table_size=ceil((double)(inode_count*128)/(double)block_size); blocks_count=block_size<<3; size=group_count*(blocks_count*block_size+(block_size<<1)+inode_table_size*block_size)+block_size+block_size; if(block_size==1024) size+=1024; printf("Size of the newformated disk will be %d bytes.\n",size); printf("Block size = %d bytes, %d group(s)\n",block_size,group_count); printf("%d inodes per group, %d blocks per group\n",inode_count,blocks_count); printf("\nDo you really want to format FS? All data will be lost! [Yn]\n"); while(1){ if(fgets(tmp,10,stdin)!=NULL){ if(!stricmp(tmp,"y\n")) break; if(!stricmp(tmp,"n\n")) return 1; } } superblock.s_inodes_count=group_count*inode_count; superblock.s_block_count=blocks_count*group_count; superblock.s_r_blocks_count=0; superblock.s_free_blocks_count=blocks_count*group_count; superblock.s_free_inodes_count=group_count*inode_count; if(block_size==1024) superblock.s_first_data_block=1; else superblock.s_first_data_block=0; superblock.s_log_block_size=block_shift; superblock.s_log_frag_size=block_shift; superblock.s_blocks_per_group=blocks_count; superblock.s_frags_per_group=blocks_count; superblock.s_inodes_per_group=inode_count; superblock.s_magic=0xEF53; superblock.s_first_ino=0; superblock.s_inode_size=128; for(i=0;i<16;i++) superblock.s_uuid[i]=rand()%256; info.block_size=block_size; info.sektors_per_block=block_size/512; info.group_desc_start=superblock.s_first_data_block+1; info.first_group_start=info.group_desc_start+info.sektors_per_block; info.group_size=2+superblock.s_blocks_per_group+ceil((double)superblock.s_inodes_per_group*128/1024); info.group_count=group_count; r=create_disk(size/512); if(r<0) return r; r=write_superblock(); if(r!=0) return r; initialise_bitmaps(); r=superblock.s_first_data_block+2; for(i=0;i<group_count;i++){ group_desc[i].bg_block_bitmap=r;r++; group_desc[i].bg_inode_bitmap=r;r++; group_desc[i].bg_inode_table=r;r+=inode_table_size; r+=blocks_count; group_desc[i].bg_free_block_count=superblock.s_blocks_per_group; group_desc[i].bg_free_inodes_count=superblock.s_inodes_per_group; group_desc[i].bg_used_dirs_count=0; clear_bitmaps(); write_bitmaps(i); } r=write_group_descriptor(); if(r!=0) return r; check(); return 0; }