forked from ParasharaRamesh/mySimpleFilesystem
-
Notifications
You must be signed in to change notification settings - Fork 1
/
superblock.c
126 lines (112 loc) · 3.41 KB
/
superblock.c
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
#include "globalConstants.h"
#include "utility.h"
//one for root
inode * root;
//curr directory
inode * currdirectory;//one for root
superblock sfssuperblock;
extern filetable FileTable[5];
int superblockInit()
{
//sfssuperblock=(superblock *)malloc(sizeof(superblock));
sfssuperblock.no_of_free_datablocks = TOTAL_DATABLOCKS;
sfssuperblock.no_of_free_inodes = TOTAL_INODES;
// sfssuperblock.inodes = (inode *)malloc(sizeof(inode)*TOTAL_INODES);
// sfssuperblock.datablocks = (datablock *)malloc(sizeof(datablock)*TOTAL_DATABLOCKS);
//sfssuperblock.inodelist=(int *)malloc(sizeof(int)*TOTAL_INODES);
//sfssuperblock.datablocklist=(int *)malloc(sizeof(int)*TOTAL_DATABLOCKS);
// if(sfssuperblock.inodes == NULL || sfssuperblock.datablocks==NULL)
// {
// return 0;
// }
for(int i=0;i<TOTAL_INODES;i++)
{
//0 if the inode is not used,1 if the inode is used.
sfssuperblock.inodelist[i]=0;
//Setting the id for each inode with its index in the list
for(int j=0;j<5;j++)
{
sfssuperblock.inodes[i].inodeList[j]=-1;
sfssuperblock.inodes[i].datablocksarray[j]=-1;
sfssuperblock.inodes[i].noOfInodes=0;
}
sfssuperblock.inodes[i].id=i;
}
for(int i=0;i<TOTAL_DATABLOCKS;i++)
{
//Marking each datablock as unused by setting it to 0
//0 means unused 1 means used
sfssuperblock.datablocklist[i]=0;
sfssuperblock.datablocks[i].id=i;
}
//Creating the root directory
sfssuperblock.inodelist[0]=1;
sfssuperblock.no_of_free_inodes--;
root=&sfssuperblock.inodes[0];
strcpy(root->name,"root");
strcpy(root->type,"directory");
root->n_link=2;
root->createtime=time(0);
root->noOfDatablocks=0;
root->noOfInodes=0;
root->parent=-1;
root->fdcount=0;
currdirectory=&sfssuperblock.inodes[0];//Setting the currentdirectory to root
//initing all filetable entries
for(int i=0;i<5;i++)
{
FileTable[i].used=0;
FileTable[i].filedescriptor=0;
FileTable[i].who=0;
FileTable[i].currfilepointer=0;
}
printf("All filetable entries are Successfully initied!\n");
return 1;
}
inode* getInode()
{
if(sfssuperblock.no_of_free_inodes > 0)
{
for(int i=0;i<TOTAL_INODES;i++)
{
if(sfssuperblock.inodelist[i]==0)
{
//Finding the smallest unused inode
sfssuperblock.no_of_free_inodes--;
sfssuperblock.inodelist[i]=1;
sfssuperblock.inodes[i].noOfInodes=0;
memset(sfssuperblock.inodes[i].name,0,sizeof(sfssuperblock.inodes[i].name));
memset(sfssuperblock.inodes[i].type,0,sizeof(sfssuperblock.inodes[i].type));
for(int j=0;j<5;j++)
{
sfssuperblock.inodes[i].inodeList[j]=-1;
sfssuperblock.inodes[i].datablocksarray[j]=-1;
}
sfssuperblock.inodes[i].noOfDatablocks=0;
return &sfssuperblock.inodes[i];
}
}
}
//Returning NULL if you cant find an empty inode
return NULL;
}
datablock* getDatablock()
{
if( sfssuperblock.no_of_free_datablocks > 0)
{
for(int i=0;i<TOTAL_DATABLOCKS;i++)
{
if(sfssuperblock.datablocklist[i]==0)
{
//Finding the smallest unused datablock
sfssuperblock.no_of_free_datablocks--;
sfssuperblock.datablocklist[i]=1;
memset(sfssuperblock.datablocks[i].data,0,sizeof(sfssuperblock.datablocks[i].data));
sfssuperblock.datablocks[i].currsize=0;
return &sfssuperblock.datablocks[i];
}
}
}
//Returning NULL if you cant find an empty inode
return NULL;
}