[Examen Diciembre 2016] Problema 3 - Parte 4

[Examen Diciembre 2016] Problema 3 - Parte 4

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 2

Estimados,

Tengo una duda sobre si como resolví este ejercicio está bien (ya que la solución propuesta es bastante distinta):

Function trunc8(c: array of char) : boolean;

Begin

int inodo;

if(!buscarInodo(c, inodo)){ // Función de la parte anterior

return false;

}

if(!IT[inodo].usado || IT[inodo].es_dir){

return false;

}

int cantBloques = IT[inodo].tamaño / 1024;

if (cantBloques <= 8){

return true;

}

else {

buff : array [0..1023] of byte;

if (IT.[inodo].indirecto_tope != 0){

bloquesIndirectos : array [0..511] of int;

if (!leer(D, IT.[inodo].indirecto, bloquesIndirectos)){

return false;

}

for (int bloqIndirecto = 0; bloqIndirecto <= IT.[inodo].indirecto_tope; bloqIndirecto++){

if (!leer(D, bloquesIndirectos[bloqIndirecto], buff)){

return false;

}

if(MB[buff] == false){

cantBloques--;

MB[buff] = true;

IT[inodo].indirecto_tope--;

if (cantBloques == 8){

return true;

}

}

}

}

}

IT[inodo].tamaño = 1024 * 8;

End

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Examen Diciembre 2016] Problema 3 - Parte 4

de Rodrigo Gallardo -

Buenas Hugo,

Aunque creo que tu solucion esta bien concepualmente, tiene algunos detallesitos:

1) Al mapa de bits lo estas intentando acceder con el buffer. En ese caso, deberias intentar accederlo con bloquesIndirectos[bloqIndirecto]. Ademas, como dicho bloque ya estaba asignado al archivo y se supone que al llamar a la funcion el filesytem esta en un estado consistente, no es necesario que preguntes si esta en falso esa entrada en el MB. Simplemente marcas el bloque apuntado por bloquesIndirectos[bloqIndirecto] como libre.

2) No es necesario  que leas el bloque apuntado por bloquesIndirectos[bloqIndirecto], y al hacerlo estarias haciendo una operacion de lectura en disco innecesaria por cada bloque apuntado por el bloque indirecto.

3) Fijate que, una vez que liberas todos los bloques apuntados por el bloque indirecto, estas devolviendo true. Sin embargo, hay un bloque que te falto liberar y es el bloque de indireccion (ya que todos los bloques de datos que apuntaba este ya no pertenecen mas al archivo; esto lo podes afirmar ya que los 8 bloques con los que se debe quedar el archivo son los 8 bloques de primer nivel).

Espero sea de ayuda. Saludos!