[SOS] Sur l'utilisation du systeme de fichier FAT
Bombela
bombela at free.fr
Dim 9 Mar 20:20:36 CET 2008
Et bien tu t'es fait plaisir mon ami !
Je ne peux que te féliciter pour ce travail si bien documenté :)
++
guerineau a écrit :
>
> Problemes et corrections apportees sur le gestionnaire FAT.
> Toutes les corrections decrites impliquent le fichier drivers/fs_fat.c
> et seulement celui ci:
>
> 1. Syndrome de la traversee de cluster:
> Au cours de l'exploration d'un repertoire, il est incorrectement
> fait l'hypothese que la prochaine
> entree possible de repertoire est toujours situee apres l'entree
> courante. Cette hypothese est fausse
> si l'entree courante est la derniere du cluster.
> Fonctions impliquees:
> - fat_unlink
> - fat_dir_lookup
> - fat_readdir
> - fetch_node_from_disk
> - fat_mount
>
> La correction a consiste a introduire une fonction
> sos_fat_helper_get_following_directory_entry qui
> verifie la condition et qui provoque une commutation vers le cluster
> suivant, quand il existe. Cette
> fonction doit etre appelee en preliminaire a chaque utilisation de
> sos_fat_helper_get_next_directory_entry.
>
> 2. fonction sos_fat_helper_get_next_directory_entry
> probleme constate : bouclage de la fonction lors d'un
> franchissement de cluster.
> Le groupe de variables locales (sector_nr, sector_limit) n'est pas
> recalcule apres une
> commutation de cluster. Ceci provoque un cycle infini.
>
> 3. fonction sos_fat_helper_find_free_directory_entry
> 3.1: probleme de meme nature que celui decrit en (2)
> 3.2: En cas d'epuisement du stock d'entree (dans le dernier cluster)
> aucune extension n'est tentee
> sous forme de generation d'un nouveau cluster.
>
> 4. determination de la variable FirstRootDirSecNum:
> Il s'agit du premier secteur du repertoire racine. Elle est
> exprimee en unite de secteurs.
> Au moment du montage -fonction fat_mount- et dans le cas d'un
> systeme FAT 32, cette variable est
> exprimee en unite de cluster (au lieu d'unite de secteur).
>
> 5. Fonction fat_mount
> Recensement du repertoire racine:
> D'une part cette fonction est atteinte par le syndrome de la
> traversee de cluster, mais,
> d'autre part, l'operation de recensement des fichiers du repertoire
> racine est incorrectement
> initialisee: l'exploration du repertoire racine est lancee a partir
> d'une adresse incorrecte
> fixee a 32 octets AVANT le debut reel du repertoire (donc pointant
> sur la queue de la derniere FAT)
>
> 6. fonction fat_write
> Calage incorrect du buffer d'ecriture dans l'utilisatiuon de la
> fonction sos_blockdev_kernel_write.
> L'offset specifiant ce calage est improprement multiplie par 4.
>
> 7. Fonction sos_fat_helper_read
> Estimation incorrecte du nombre de clusters impliques dans
> l'operation de lecture.
> Dans le cas ou le debut de la lecture ne coincide pas avec une
> frontiere de cluster,
> la lecture est tronquee du contenu du dernier cluster.
>
> 8. Fonction sos_fat_helper_read
> Determination du volume de donnees dans la lecture du premier cluster.
> Dans le cas ou les notions de cluster et de secteurs ne sont pas
> geometriquement equivallentes,
> le volume de donnee de la premiere lecture, impliquant le premier
> cluster est incorrectement
> estime.
> Le determination du volume de donnee initiale doit etre calcule
> comme suit:
> len : cluster_size - (storage_location -
> first_data_sector_location) % cluster_size
> avec: first_data_sector_location: origine (adresse octet) du
> premier secteur de donnnees
> au lieu de:
> len : cluster_size - storage_location % cluster_size
> Ces deux formules divergent des que la taille d'un cluster est
> differente de celle d'un secteur.
>
> 9. Fonction sos_fat_helper_get_next_directory_entry
> Certaines entrees ne sont pas vues dans les conditions suivantes:
> - la taille du cluster est strictement superieure a 1 (c'est a
> dire qu'un cluster
> comprend au moins deux secteurs)
> - la recherche dans le repertoire commence a partir du debut du
> repertoire
> - l'entree du fichier cherche ne se situe pas dans le premier
> secteur du repertoire
> Le probleme vient de la variable "sector_rem" specifiant la premiere
> entree de repertoire a explorer:
> Elle est en fait relative a un secteur.
> Elle doit etre remise a zero des que l'exploration du premier
> secteur est terminee, sinon,
> les "sector_rem" entrees du secteur suivant sont occultees.
>
> 10. Fonction sos_fat_helper_find_free_directory_entry:
> Meme nature de probleme que celui evoque en (9)
> Ici, il ne s'agit pas a proprement parler d'un probleme, puisque les
> conditions necessaires
> a son apparition ne sont jamais remplies dans la realisation actuelle.
> Une correction a neanmoins ete apporte avec le patch joint.
>
> 11. Fonction sos_fat_helper_remove_all_cluster:
> Une operation excedentaire de mise a jour de FAT est declenchee.
> Le cluster implique, s'il etait licite, serait celui correpondant
> au code de fin de
> cluster (cluster numero 0xFFF8, dans le cas de FAT 16)
> Generalement cette operation provoque une alteration de la
> seconde FAT, ou des donnnes utiles ...
>
> Christian Guerineau
> Ci joint: patch corrigeant les problemes ci dessus evoques.
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Sos mailing list
> Sos at the-doors.enix.org
> http://the-doors.enix.org/cgi-bin/mailman/listinfo/sos
>
Plus d'informations sur la liste de diffusion Sos