inode_write()

Lo siento, hasta aquí llegamos :(

Un poco de explicación...

Bien, ya a estas alturas ya tienes una mejor idea de qué hacer en esta función. Déjame decirte unas buenas noticias: esta función es 60% copy paste lo que hiciste en inode_read() y el resto es implementación que no lleva un día en hacerlo.

Como ya sabes, esta función consiste en escribir ciertos contenidos al inode en en el disco. Esta operación puede causar una sobreescritura y/o una expansión o contracción del archivo. Lo único nuevo que debes de implementar es el crecimiento del archivo o contracción (si se diera el caso).

Implementación

Aquí está el código base para el inode_write():

off_t
inode_write_at (struct inode *inode, const void *buffer_, off_t size,
                off_t offset) 
{
  const uint8_t *buffer = buffer_;
  off_t bytes_written = 0;

  if (inode->deny_write_cnt)
    return 0;

  while (size > 0) {
  
  }

  return bytes_written;
}

Lo que debes de hacer es lo siguiente:

  1. Ubicar el byte correcto donde empieza la escritura (es decir, buscar el sector empleando el inode y aplicar un offset para empezar en el byte correcto).

  2. Llenar los bytes necesarios con ceros. (Si es necesario)

  3. Escribir los contenidos nuevos a los sectores adecuados.

  4. Actualizar el inode.

Prácticamente el paso 1 ya lo tienes, que sería un copy paste de lo que haz hecho en inode_read().

Ahora bien, te daré una mano con los siguientes pasos.

Aconsejamos mucho seguir los pasos que nosotros sugerimos. Ahora bien, el paso 2 puede hacerse al final pero será más difícil.

Llenar los bytes necesarios con ceros

Existe un caso particular en los archivos que debes tomar muy en cuenta. Asume que un archivo tiene un tamaño de 50 bytes. Con el Inode, el archivo es capaz de crecer exageradamente.

Ahora, asume un offset de 100 bytes... suena extraño, ¿no es así? Sí, es una posibilidad para hacer crecer el archivo.

¿Qué debes de hacer en este caso? Sabes que los contenidos del archivo se encuentran en el byte 0 al 49, luego le sigue un EOF y luego lo que exista en los siguientes bytes. Ahora, como te piden escribir a partir del byte 100, debes de llenar con ceros los bytes del 50 al 99.

Siguiendo con el mismo ejemplo. Ahora imagina que el offset es de 2048. Entonces debes de llenar con ceros los bytes del 50 al 2047. Luego, a partir del byte 2048 empiezas a escribir los contenidos que te solicitan.

Esto suena como si fuera una extensión del inode_create(). Si lo quieres ver de esa forma, está bien. Pero como te habrás percatado, debes de construir los bloques adicionales del inode y asociar nuevos sectores a esos nuevos bloques. Luego de haberlos asociados, los llenas con ceros.

Puedes optar por primero en extender la estructura del inode y luego llenar con ceros, o cada vez que asocias un nuevo sector, este inicializas sus contenidos con ceros.

Este paso, en algunos casos, es opcional. No siempre el offset será un número ridículo.

Escribir los contenidos nuevos a los sectores adecuados

Ahora, después de haber llenado con ceros los bytes necesarios, es tiempo de escribir los nuevos contenidos a los sectores correspondientes. En este paso, puede ocurrir una sobreescritura. En este caso, simplemente lees del buffer cache y haces la operación de escritura al sector correcto. En otro caso, puedes encontrarte en una situación que debes de expandir el archivo. Es prácticamente lo mismo que hiciste en el paso 2 de Llenar los bytes necesarios con ceros. Creas los nuevos bloques que necesitas y asocias sectores a esos bloques. Luego de haber expandido la estructura del inode empiezas a escribir los contenidos a estos nuevos sectores.

Puedes optar por por extender la estructura del inode y luego escribir los contenidos o puedes hacer ambas tareas simultáneamente.

Ahora bien... cuando terminas de escribir todo el contenido nuevo a los sectores... ¿debes escribir un EOF o no?

Y por último, podrás encontrarte una situación que es el híbrido de los anteriores. En ese caso, debes de diferenciar muy bien lo que ya existe y lo que está a punto de existir. Pero confío en ti y se que lo lograrás.

Actualizar el inode

Como ahora el tamaño del inode es distinto, debes actualizar este dato en la estructura.

Con este paso, habrás terminado la expansión de archivos. ¡Buen trabajo!

FAQ

  • ¿Y qué sucede cuando un archivo disminuye su contenido?

    Debes de hacer el proceso inverso. Te dejo el reto, pequeño programador :D

Last updated