Chaque fichier ou répertoire est défini par un inœud, tel que le cours le présente, avec un type, une taille de fichier en octets, et les tables de numéro de blocs, « direct », « indirect » et « double indirect ».
Les inœuds sont bien entendu enregistrés sur le disque. Nous choisissons d’enregistrer un unique inœud par bloc. (Cela est inhabituel, la taille d’un inœud étant petite devant celle d’un bloc.) Un inœud est identifié par son inombre qui ne sera dans notre cas rien d’autre qu’un numéro de bloc.
Nous définissons deux fonctions utilitaires pour réaliser l’écriture et la lecture sur le disque d’un inœud.
void read_inode(unsigned int inumber, struct inode_s *inode); void write_inode(unsigned int inumber, struct inode_s *inode);
ainsi que deux fonctions de création et destruction d’un inœud :
unsigned int create_inode(enum file_type_e type); int delete_inode(unsigned int inumber);
La fonction create_inode() est chargé de l’allocation d’un bloc pour y ranger l’inœud, et de l’initialisation de celui-ci. Elle retourne le inombre correspondant.
La fonction delete_inode() libère l’ensemble des blocs de données associés à l’inœud, y compris le bloc de l’inœud lui-même.
Afin de développer la couche logicielle supérieure, nous allons présenter un fichier sous la forme d’une suite continue de blocs de données. Il est donc nécessaire de convertir un indice de bloc d’un inœud en un numéro de bloc dans le volume. Une telle conversion repose sur le parcours de la table des numéros de blocs directs, indirects et double indirects de l’inœud.
qui retourne le numéro de bloc sur le volume qui correspond au fbloc-ième bloc de l’inœud. Dans un premier temps, cette fonction retourne une valeur nulle si le bloc n’a pas été alloué.unsigned int vbloc_of_fbloc(unsigned int inumber, unsigned int fbloc);
Cette fonction vbloc_of_fbloc() est utilisée pour accéder en lecture à un bloc de données correspondant à un inœud. Si l’on désire accéder en écriture à un tel bloc, il est nécessaire d’allouer ce bloc et de le rattacher à la structure des blocs directs, indirects, double indirects de l’iœud.
Nous ajoutons un paramètre booléen à la fonction vbloc_of_fbloc() qui indique si le comportement de la fonction doit être de retourner une valeur nulle ou d’allouer le bloc en cas de bloc non encore existant.
qui retourne le numéro du bloc dans le volume qui correspond au fbloc-ième bloc de l’inœud. Si ce bloc n’est pas alloué et do_allocate, la fonction se charge de l’allocation du bloc et de le connecter à la structure de l’inoœud.unsigned int vbloc_of_fbloc(unsigned int inumber, unsigned int fbloc, bool_t do_allocate);
Validation de la troisième couche logicielle : structure d’un volume et d’un fichier
Vous pourrez valider votre bibliothèque de gestion d’un volume et de gestion d’inœuds à l’aide de l’archive que nous vous fournissons et qui permet de produire les commandes listées dans l’encart «Validation de la bibliothèque de manipulation de fichier par leur inombre». Voir le répertoire ifile du dépôt Git :
https://gitlab-etu.fil.univ-lille1.fr/ms1-ase/src