Implemented changes proposed by the teacher.
[fsck.sofs09.git] / fsck.tex
blob67349f39743576c4e7ffcd3daf36ad8e42e474ef
1 \documentclass{article}
2 \usepackage[portuguese]{babel}
3 \usepackage[utf8]{inputenc}
4 \usepackage{indentfirst}
5 \usepackage{listings}
7 \lstset{
8 language=C,
9 tabsize=2
11 \newcommand{\code}[1]{{\tt #1}}
13 \begin{document}
15 \title{
16 \code{fsck.sofs09}%\\\bigskip
17 %Programa para teste de consistência e correcção de erros de um sistema de
18 %ficheiros SOFS09
20 \author{Cristóvão Cruz}
21 \date{\today}
23 \maketitle
25 \section{Introdução}
27 Este projecto visa desenvolver um programa que detecte e, quando possível,
28 corriga erros num sistema de ficheiros SOFS09.
30 \section{O sistema de ficheiros}
31 O sistema de ficheiros SOFS09 é constituido por várias zonas que contêm
32 informação dedicada à gestão do espaço em disco e uma zona de dados, todas elas
33 contínuas.
35 Para gerir o espaço em disco existem as seguintes zonas:
36 \begin{itemize}
37 \item Superbloco: informação acerca da localização de todas as outras zonas;
38 \item Tabela de clusters livres (FCT): tabela com os endereços de todos os
39 \emph{clusters} livres. O seu tamanho tem que ser suficiente para armazenar
40 tantos endereços como os \emph{clusters} da zona de dados;
41 \item Tabela de associação \emph{clusters} --- nó-i (CIUT): indica qual o
42 nó-i que está a utilizar cada \emph{cluster} da zona de dados. O seu tamanho
43 é igual ao da FCT;
44 \item Tabela de nós-i (IT): tabela onde estão localizados todos os nós-i do
45 sistema de ficheiros. O seu tamanho é definido pelo utilizador aquando da
46 criação do sistema de ficheiros;
47 \end{itemize}
49 A zona de dados ocupa todo o espaço restante e está dividida em \emph{clusters},
50 que são a unidade mínima de espaço que pode ser alocada neste sistema de
51 ficheiros.
53 \section{A estrutura do programa}
55 O programa faz todos os testes que se encontrem no array testes, cujo conteúdo é
56 o endereço das várias funções que implementam os testes. Estas funções devolvem
57 um valor do tipo \code{testresult\_t}, cuja definição se segue:
58 \begin{lstlisting}
59 typedef enum {corrupt, weird, nice} testresult_t;
60 \end{lstlisting}
62 Se o resultado de uma função for \code{corrupt}, a não ser que possa ser
63 corrigido e o utilizador o peça explicitamente, o sistema de ficheiros é
64 considerado corrupto e não são realizados mais testes. Se o resultado for
65 \code{weird}, o utilizador é notificado com uma mensagem e o teste continua.
66 \code{nice} indica que está tudo nos conformes. \textbf{De momento ainda não se encontra
67 implementada a funcionalidade de correcção do sistema de ficheiros.}
69 O acesso ao superbloco é feito a partir da primitiva \code{fetch\_superblock} que
70 coloca no argumento um endereço de memória onde se encontra armazenado o
71 superbloco. Esta função não monitoriza alterações, assumindo que a informação é
72 apenas para ser lida do superbloco e nunca escrita. Quando for necessário
73 escrever informação no superbloco (para corrigir o sistema de ficheiros), será
74 necessário alterar esta rotina.
75 \begin{lstlisting}
76 void fetch_superblock(SOSuperBlock **sb);
77 \end{lstlisting}
79 Existem ainda várias tabelas. A \code{ictable} serve para armazenar informação
80 acerca do estado de utilização dos nós-i. A \code{cctable} serve para armazenar
81 informação acerca da utilização dos \emph{clusters} de dados. A \code{irtable}
82 serve para armazenar o \code{refcount} real de cada nó-i. Para alocar e
83 descartar as tabelas existem as primitivas \code{create} e \code{delete}. Todas
84 as tabelas são acedidas a partir de primitivas internas e nunca directamente. A
85 primitiva \code{print}, disponível para a \code{cctable} e \code{itable} (sim,
86 itable), apresenta as tabelas de forma a que o utilizador consiga perceber o
87 estado do sistema de ficheiros. Os valores armazenados nas tabelas são do tipo
88 \code{ic\_t} para a \code{ictable}, \code{cc\_t} para a \code{cctable} e
89 \code{uint32\_t} para a \code{irtable}. Inicialmente, todas as posições das
90 tabelas \code{cctable} e \code{ictable} têm o valor \code{bah}. A \code{irtable}
91 tem \code{0}.
92 \begin{lstlisting}
93 typedef enum{idle, busy, bah} ic_t;
94 typedef enum{idle, busy, bah} cc_t;
96 void ictable_create(void);
97 void ictable_free(void);
98 void ictable_set(uint32_t index, ic_t value);
99 void ictable_get(uint32_t index, ic_t *value);
101 void cctable_create(void);
102 void cctable_free(void);
103 void cctable_set(uint32_t index, cc_t value);
104 void cctable_get(uint32_t index, cc_t *value);
105 void cctable_print(void);
107 void irtable_create(void);
108 void irtable_free(void);
109 void irtable_inc(uint32_t index);
110 void irtable_get(uint32_t index, uint32_t *value);
112 void itable_print(void);
113 \end{lstlisting}
115 \section{O Superbloco}
116 O primeiro passo da verificação de consistência do sistema de ficheiros é
117 verificar se o superbloco está em condições. Só tendo um superbloco em condições
118 poderemos passar a testes mais profundos. Alguns dos erros encontrados aqui têm
119 salvação, mas a maior parte não, dado que são dados acertados aquando da
120 formatação e uma inconsistência nestes revela um formatador defeituoso.
122 Todos os nomes de variáveis aqui usados estão documentados no código fonte do
123 SOFS09.
125 São implementados os seguintes testes para analisar o superbloco:
126 \begin{itemize}
127 \item \code{test\_sbmagic}: verifica se estamos a lidar com um sistema de
128 ficheiros do tipo SOFS09 olhando para o número "mágico".
129 \begin{itemize}
130 \item \code{corrupt}: o número mágico não está correcto.
131 \item Solução: não tem.
132 \end{itemize}
133 \item \code{test\_sbname}: verifica se o nome do disco é uma \emph{string}
134 válida, ou seja, se está devidamente terminada.
135 \begin{itemize}
136 \item \code{corrupt}: o nome não está terminado.
137 \item Solução: não tem.
138 \end{itemize}
139 \item \code{test\_sbzones}: verifica se as várias zonas do sistema de
140 ficheiros se encontram contíguas, se cabem no disco ou se são pequenas
141 demais.
142 \begin{itemize}
143 \item \code{corrupt}: as zonas sobrepoem-se, excedem o tamanho do disco
144 ou são pequenas demais.
145 \item \code{weird}: as zonas não estão contíguas.
146 \item Solução: não tem.
147 \end{itemize}
148 \item \code{test\_sbfctablesize}
149 \item \code{test\_sbciutablesize}
150 \item \code{test\_sbitotal}: estes três testes são semelhantes e verificam
151 se os tamanhos das várias zonas são grandes o suficiente para um bom
152 funcionamento do sistema de ficheiros.
153 \begin{itemize}
154 \item \code{corrupt}: pelo menos uma das zonas não é grande o
155 suficiente.
156 \item \code{weird}: as zonas são maiores do que o necessário.
157 \item Solução: não tem.
158 \end{itemize}
159 \end{itemize}
161 \section{Os Nós-I}
163 Os nós-i podem estar livres ou conter informação relativa a um ficheiro, um
164 \emph{link} ou uma pasta.
166 \begin{itemize}
167 \item \code{test\_infree}: verifica se \code{ifree} corresponde ao número
168 de nós-i que estão livres, percorrendo a lista de nós-i livres. Esta função
169 preenche parte da \code{ictable}.
170 \begin{itemize}
171 \item \code{corrupt}: \code{ifree} está incorrecto, algum nó-i da lista
172 não está marcado como livre ou a lista de nós-i livres fecha-se sobre si
173 mesma.
174 \item Solução: No primeiro caso, alterar o valor de \code{ifree} para
175 concordar com a quantidade de nós-i que estão na lista biligada. No
176 segundo caso, marcar o nó-i como livre. No último caso, não sei.
177 \end{itemize}
178 \item \code{test\_inused}: percorrer todas as entradas de directório e
179 contar o número de vezes que cada nó-i é referenciado. Comparar depois com o
180 valor de \code{refcount} de cada nó-i.
181 \begin{itemize}
182 \item \code{corrupt}: se forem encontradas discrepâncias.
183 \item Solução: corrigir o \code{refcount} dos nós-i. Se estes não forem
184 referenciados por nenhuma entrada de directório, libertar o nó-i e os
185 \emph{clusters} detidos por ele.
186 \end{itemize}
187 \item \code{test\_inlost}: depois de corridos os testes \code{infree} e
188 \code{inused} estamos em condições de saber se há nós-i perdidos recorrendo
189 à \code{ictable}.
190 \begin{itemize}
191 \item \code{corrupt}: há nós-i perdidos.
192 \item Solução: adiciona-los à IT.
193 \end{itemize}
194 \item \code{teste\_ininfo}: verifica se a informação de cada nó-i é
195 consistente.
196 \begin{itemize}
197 \item \code{corrupt}: \code{refcount} é zero mas o nó-i não está
198 livre...
199 \item \code{weird}: permissões manhosas (007)...
200 \item Solução: a estas horas já não sei é nada!!!
201 \end{itemize}
202 \end{itemize}
204 \section{Os Clusters}
206 Um cluster pode estar a ser utilizado por um ficheiro ou estar livre.
208 \begin{itemize}
209 \item \code{test\_clusterfree}: verifica se \code{dzone\_free}
210 corresponde ao número de posições ocupadas na FCT mais os \code{cache\_cnt}
211 das \emph{caches}.
212 \begin{itemize}
213 \item \code{corrupt}: não corresponde
214 \item Solução: alterar \code{dzone\_free} para corresponder ao número de
215 posições ocupadas na FCT mais os \code{cache\_cnt} das \emph{caches}.
216 \end{itemize}
217 \item \code{test\_clusterused}: analisa onde estão referenciados os
218 clusters percorrendo todos os nós-i em utilização e comparar essas
219 referências com a CIUT.
220 \begin{itemize}
221 \item \code{corrupt}: um \emph{cluster} está associado a mais do que um
222 nó-i, está referenciado mais do que uma vez na FCT ou está
223 simultaneamente referenciado na FCT e associado a um ou mais nós-i. Pode
224 também acontecer quando um \emph{cluster} tem uma entrada na CIUT
225 diferente do nó-i a que está realmente associado.
226 \item Solução: se um \emph{cluster} estiver associado a mais do que um
227 nó-i, alocar tantos \emph{clusters} quantos os nós-i a que eles estão
228 associados menos um, e colocar neles o conteúdo do nó-i "existente". Se
229 o \emph{cluster} estiver simultaneamente na FCT removê-lo de lá. Se
230 estiver várias vezes referênciado na FCT, removê-lo tantas vezes quantas
231 aparecer a mais.
232 \end{itemize}
233 \item \code{test\_clusterlost}: depois de analisada a FCT e \emph{caches} e
234 analisar quais os \emph{clusters} que estão a ser utilizados, estamos em
235 condições de dizer se existem \emph{clusters} perdidos olhando para a
236 \code{cctable}.
237 \begin{itemize}
238 \item \code{corrupt}: existem \emph{clusters} perdidos.
239 \item Solução: adicionar os \emph{clusters} perdidos à tabela de
240 \emph{clusters} livres.
241 \end{itemize}
242 \end{itemize}
244 \end{document}