File: format.c | Size: 3,190 bytes | Download file | Back to directory listing | BWPOW's homepage
#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;
}