infree simplified, irtable_get corrected and sbname added.
[fsck.sofs09.git] / fsck.tex
blob9cb9cfda936de34bcadaaf58219e1cdf6d09ec73
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{fech\_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. Todas as tabelas são
83 acedidas a partir de primitivas internas e nunca directamente. Estas primitivas
84 tratam de alocar espaço para as tabelas, inicializar o seu conteúdo a valores
85 adequados e libertar as tabelas no final do programa. A primitiva \code{print},
86 disponível para a \code{cctable} e \code{ictable} apresenta as tabelas de forma
87 a que o utilizador consiga perceber o estado do sistema de ficheiros. Os valores
88 armazenados nas tabelas são do tipo \code{ic\_t} para a \code{ictable},
89 \code{cc\_t} para a \code{cctable} e \code{uint32\_t} para a \code{irtable}.
90 Inicialmente, todas as posições das tabelas \code{cctable} e \code{ictable} têm
91 o valor \code{bah}. A \code{irtable} 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_set(uint32_t index, ic_t value);
97 void ictable_get(uint32_t index, ic_t *value);
98 void ictable_print(void);
100 void cctable_set(uint32_t index, cc_t value);
101 void cctable_get(uint32_t index, cc_t *value);
102 void cctable_print(void);
104 void irtable_inc(uint32_t index);
105 void irtable_get(uint32_t index, uint32_t *value);
106 \end{lstlisting}
108 \section{O Superbloco}
109 O primeiro passo da verificação de consistência do sistema de ficheiros é
110 verificar se o superbloco está em condições. Só tendo um superbloco em condições
111 poderemos passar a testes mais profundos. Alguns dos erros encontrados aqui têm
112 salvação, mas a maior parte não, dado que são dados acertados aquando da
113 formatação e uma inconsistência nestes revela um formatador defeituoso.
115 Todos os nomes de variáveis aqui usados estão documentados no código fonte do
116 SOFS09.
118 São implementados os seguintes testes para analisar o superbloco:
119 \begin{itemize}
120 \item \code{test\_sbmagic}: verifica se estamos a lidar com um sistema de
121 ficheiros do tipo SOFS09 olhando para o número "mágico".
122 \begin{itemize}
123 \item \code{corrupt}: o número mágico não está correcto.
124 \item Solução: não tem.
125 \end{itemize}
126 \item \code{test\_sbname}: verifica se o nome do disco é uma \emph{string}
127 válida, ou seja, se está devidamente terminada.
128 \begin{itemize}
129 \item \code{corrupt}: o nome não está terminado.
130 \item Solução: não tem.
131 \end{itemize}
132 \item \code{test\_sbzones}: verifica se as várias zonas do sistema de
133 ficheiros se encontram contíguas, se cabem no disco ou se são pequenas
134 demais.
135 \begin{itemize}
136 \item \code{corrupt}: as zonas sobrepoem-se, excedem o tamanho do disco
137 ou são pequenas demais.
138 \item \code{weird}: as zonas não estão contíguas.
139 \item Solução: não tem.
140 \end{itemize}
141 \item \code{test\_sbfctablesize}
142 \item \code{test\_sbciutablesize}
143 \item \code{test\_sbitotal}: estes três testes são semelhantes e verificam
144 se os tamanhos das várias zonas são grandes o suficiente para um bom
145 funcionamento do sistema de ficheiros.
146 \begin{itemize}
147 \item \code{corrupt}: pelo menos uma das zonas não é grande o
148 suficiente.
149 \item \code{weird}: as zonas são maiores do que o necessário.
150 \item Solução: não tem.
151 \end{itemize}
152 \end{itemize}
154 \section{Os Nós-I}
156 Os nós-i podem estar livres ou conter informação relativa a um ficheiro, um
157 \emph{link} ou uma pasta.
159 \begin{itemize}
160 \item \code{test\_infree}: verifica se \code{ifree} corresponde ao número
161 de nós-i que estão livres, percorrendo a lista de nós-i livres. Esta função
162 preenche parte da \code{ictable}.
163 \begin{itemize}
164 \item \code{corrupt}: \code{ifree} está incorrecto, algum nó-i da lista
165 não está marcado como livre ou a lista de nós-i livres fecha-se sobre si
166 mesma.
167 \item Solução: No primeiro caso, alterar o valor de \code{ifree} para
168 concordar com a quantidade de nós-i que estão na lista biligada. No
169 segundo caso, marcar o nó-i como livre. No último caso, não sei.
170 \end{itemize}
171 \item \code{test\_inused}: percorrer todas as entradas de directório e
172 contar o número de vezes que cada nó-i é referenciado. Comparar depois com o
173 valor de \code{refcount} de cada nó-i.
174 \begin{itemize}
175 \item \code{corrupt}: se forem encontradas discrepâncias.
176 \item Solução: corrigir o \code{refcount} dos nós-i. Se estes não forem
177 referenciados por nenhuma entrada de directório, libertar o nó-i e os
178 \emph{clusters} detidos por ele.
179 \end{itemize}
180 \item \code{test\_inlost}: depois de corridos os testes \code{infree} e
181 \code{inused} estamos em condições de saber se há nós-i perdidos recorrendo
182 à \code{ictable}.
183 \begin{itemize}
184 \item \code{corrupt}: há nós-i perdidos.
185 \item Solução: adiciona-los à IT.
186 \end{itemize}
187 \item \code{teste\_ininfo}: verifica se a informação de cada nó-i é
188 consistente.
189 \begin{itemize}
190 \item \code{corrupt}: \code{refcount} é zero mas o nó-i não está
191 livre...
192 \item \code{weird}: permissões manhosas (007)...
193 \item Solução: a estas horas já não sei é nada!!!
194 \end{itemize}
195 \end{itemize}
197 \section{Os Clusters}
199 Um cluster pode estar a ser utilizado por um ficheiro ou estar livre.
201 \begin{itemize}
202 \item \code{test\_clusterfree}: verifica se \code{dzone\_free}
203 corresponde ao número de posições ocupadas na FCT mais os \code{cache\_cnt}
204 das \emph{caches}.
205 \begin{itemize}
206 \item \code{corrupt}: não corresponde
207 \item Solução: alterar \code{dzone\_free} para corresponder ao número de
208 posições ocupadas na FCT mais os \code{cache\_cnt} das \emph{caches}.
209 \end{itemize}
210 \item \code{test\_clusterused}: analisa onde estão referenciados os
211 clusters percorrendo todos os nós-i em utilização e comparar essas
212 referências com a CIUT.
213 \begin{itemize}
214 \item \code{corrupt}: um \emph{cluster} está associado a mais do que um
215 nó-i, está referenciado mais do que uma vez na FCT ou está
216 simultaneamente referenciado na FCT e associado a um ou mais nós-i. Pode
217 também acontecer quando um \emph{cluster} tem uma entrada na CIUT
218 diferente do nó-i a que está realmente associado.
219 \item Solução: se um \emph{cluster} estiver associado a mais do que um
220 nó-i, alocar tantos \emph{clusters} quantos os nós-i a que eles estão
221 associados menos um, e colocar neles o conteúdo do nó-i "existente". Se
222 o \emph{cluster} estiver simultaneamente na FCT removê-lo de lá. Se
223 estiver várias vezes referênciado na FCT, removê-lo tantas vezes quantas
224 aparecer a mais.
225 \end{itemize}
226 \item \code{test\_clusterlost}: depois de analisada a FCT e \emph{caches} e
227 analisar quais os \emph{clusters} que estão a ser utilizados, estamos em
228 condições de dizer se existem \emph{clusters} perdidos olhando para a
229 \code{cctable}.
230 \begin{itemize}
231 \item \code{corrupt}: existem \emph{clusters} perdidos.
232 \item Solução: adicionar os \emph{clusters} perdidos à tabela de
233 \emph{clusters} livres.
234 \end{itemize}
235 \end{itemize}
237 \section{As Entradas de Directório}
239 Uma entrada de directório detem o nome e o índice do nó-i respectivo.
241 \begin{itemize}
242 \item \code{test\_deindex}: verificar se o índice do nó-i apontado é válido;
243 \begin{itemize}
244 \item \code{corrupt}: o índice é maior que máximo permitido;
245 \item Solução: não tem;
246 \end{itemize}
247 \end{itemize}
249 \end{document}