[SOS] Sur l'utilisation du systeme de fichier FAT

anthoine.bourgeois anthoine.bourgeois at wanadoo.fr
Sam 5 Avr 12:00:06 CEST 2008


Bonjour,

Merci Guerineau pour tes 2 patchs sur l'ide et le fs fat.
Je vais essayer d'en intégrer et d'en corriger le plus
possible pour le prochain article de SOS.

Pour répondre à Edouard, l'article 10 sera mise en ligne
lorsque l'article suivant sera sorti dans linux mag.
J'y travaille mais je n'ai pas beaucoup de temps.

A+,
Anthoine


> Message du 08/03/08 18:12
> De : "guerineau" <chris.guer at wanadoo.fr>
> A : "SOS mailing-list" <sos at the-doors.enix.org>
> Copie à : 
> Objet : [SOS] Sur l'utilisation du systeme de fichier FAT
> 
> 
> 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_10_fat.pat (24.0 Ko) ]
> [ (pas de nom de fichier) (0.1 Ko) ]



Plus d'informations sur la liste de diffusion Sos