[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