El codigo que presenta la solucion con recorrida no eficiente es el siguiente:
1 function deleteFile(inodo: Integer): boolean;
2 var cambiado, encontre: boolean; nroInodo, block, entry: Integer;
3 buff: array[1..64] of dir_entry;
4 begin
5 if(IT[inodo].used && IT[inodo].type == ‘file’)then
6 nroInodo := 0;
7 while(nroInodo < Max_Inodos && IT[inodo].reference > 0) do
8 if(IT[nroInodo].used && IT[nroInodo].type == 'dir' && IT[nroInodo].tope > 0) then
9 cambiado := false;
10 block := 1;
11 while(block < IT[nroInodo].tope)do
12 read(D, IT[nroInodo].data[block], buff);
13 entry := 1;
14 while (entry <= 64) do
15 if(buff[entry].used and buff[entry].inode_num == inodo)then
16 buff[entry].used := false;
17 IT[inodo].reference--;
18 cambiado := true;
19 end if;
20 end while;
21 end while;
22 if(cambiado)then
23 write(D, IT[nroInodo].data[block], buff);
24 end if
25 nroInodo++;
26 end while;
27 for(int i = 0; i < IT[inodo].tope; i++)
28 MB[IT[inodo].data[i]] = 0; // libero bloques
29 IT[inodo].used := false;
30 return (IT[inodo].reference==0);
31 else
32 return false;
33 end if
34end functon;
Creo que de llegar tanto al while de la linea 11 y de la linea 14 nunca se saldira del loop ya que ni entry ni block se incrementan.
Tambien
se tiene que el write esta en la linea 23 despues de que se termina el
while que tiene como intencion iterar los bloques por lo cual el unico
bloque que puede ser reescrito es el ultimo recorrido.
Ademas es en la linea 9 que se setea cambiado a false por lo que no en caso de arreglar el error anterior se deberia cambiar esto a antes de analizar el siguiente bloque ya que de no ser asi el hecho de que se cambie el primer bloque por ejemplo causaria que todos los siguientes se deban reescribir aunque no tengan cambios.
Cosas similares suceden en la solucion con recorrida eficiente.