Debido a que el archivo se puede abrir varias veces, cuando cierra un descriptor, solo en la última llamada de cierre para la última referencia al archivo se invoca la liberación. Así que hay una diferencia entre cerrar y liberar.
release:llamado en el último cierre (2) de este archivo, es decir, cuando el archivo->f_count llega a 0. Aunque se define como un int de retorno, VFS ignora el valor de retorno (ver fs/file_table.c:__fput()). más
Tuve una confusión similar. Perreal tiene razón en que no se llama release cuando se llama close. Aquí hay un extracto del libro Linux Device Drivers 3rd edition:
int (*flush) (struct file *);
La operación de vaciado se invoca cuando un proceso cierra su copia de un descriptor de archivo para un dispositivo; debe ejecutar (y esperar) cualquier operación pendiente en el dispositivo. Esto no debe confundirse con la operación fsync solicitada por los programas de usuario. Actualmente, el vaciado se usa solo en el código del sistema de archivos de red (NFS). Si flush es NULL, simplemente no se invoca.
int (*release) (struct inode *, struct file *);
Esta operación se invoca cuando se libera la estructura del archivo. Como abierto, puede faltar liberación.
Tenga en cuenta que la liberación no se invoca cada vez que se cierra un proceso. Cada vez que se comparte una estructura de archivos (por ejemplo, después de una bifurcación o un dup), no se invocará la liberación hasta que se cierren todas las copias. Si necesita vaciar los datos pendientes cuando se cierra una copia, debe implementar el método de vaciado.