<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=iso-8859-1" http-equiv=Content-Type>
<META content="MSHTML 5.00.2014.210" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2><BR>Problemes et corrections apportees sur le
gestionnaire FAT.<BR>Toutes les corrections decrites impliquent le fichier
drivers/fs_fat.c et seulement celui ci:</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>1. Syndrome de la traversee de cluster:<BR>
Au cours de l'exploration d'un repertoire, il est incorrectement fait
l'hypothese que la prochaine<BR> entree possible de repertoire est toujours
situee apres l'entree courante. Cette hypothese est fausse<BR> si l'entree
courante est la derniere du cluster.<BR> Fonctions
impliquees:<BR> - fat_unlink<BR> -
fat_dir_lookup<BR> - fat_readdir<BR> -
fetch_node_from_disk<BR> - fat_mount</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2> La correction a consiste a introduire une
fonction sos_fat_helper_get_following_directory_entry qui<BR> verifie la
condition et qui provoque une commutation vers le cluster suivant, quand il
existe. Cette<BR> fonction doit etre appelee en preliminaire a chaque
utilisation de sos_fat_helper_get_next_directory_entry.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>2. fonction
sos_fat_helper_get_next_directory_entry <BR> probleme constate :
bouclage de la fonction lors d'un franchissement de cluster.<BR> Le
groupe de variables locales (sector_nr, sector_limit) n'est pas recalcule apres
une <BR> commutation de cluster. Ceci provoque un cycle
infini.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>3. fonction
sos_fat_helper_find_free_directory_entry<BR> 3.1: probleme de meme nature
que celui decrit en (2)<BR> 3.2: En cas d'epuisement du stock d'entree
(dans le dernier cluster) aucune extension n'est
tentee<BR> sous forme de generation d'un nouveau
cluster.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>4. determination de la variable
FirstRootDirSecNum:<BR> Il s'agit du premier secteur du repertoire
racine. Elle est exprimee en unite de secteurs.<BR> Au moment du
montage -fonction fat_mount- et dans le cas d'un systeme FAT 32, cette variable
est<BR> exprimee en unite de cluster (au lieu d'unite de
secteur).<BR> <BR>5. Fonction fat_mount<BR> Recensement du repertoire
racine: <BR> D'une part cette fonction est atteinte par le syndrome de la
traversee de cluster, mais,<BR> d'autre part, l'operation de recensement
des fichiers du repertoire racine est incorrectement <BR> initialisee:
l'exploration du repertoire racine est lancee a partir d'une adresse incorrecte
<BR> fixee a 32 octets AVANT le debut reel du repertoire (donc pointant
sur la queue de la derniere FAT)</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>6. fonction fat_write<BR> Calage
incorrect du buffer d'ecriture dans l'utilisatiuon de la fonction
sos_blockdev_kernel_write.<BR> L'offset specifiant ce calage est
improprement multiplie par 4.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>7. Fonction sos_fat_helper_read<BR>
Estimation incorrecte du nombre de clusters impliques dans l'operation de
lecture.<BR> Dans le cas ou le debut de la lecture ne coincide pas
avec une frontiere de cluster,<BR> la lecture est tronquee du
contenu du dernier cluster.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>8. Fonction sos_fat_helper_read<BR>
Determination du volume de donnees dans la lecture du premier
cluster.<BR> Dans le cas ou les notions de cluster et de secteurs ne
sont pas geometriquement equivallentes,<BR> le volume de donnee de la
premiere lecture, impliquant le premier cluster est incorrectement<BR>
estime.<BR> Le determination du volume de donnee initiale doit etre
calcule comme suit:<BR> len : cluster_size -
(storage_location - first_data_sector_location) %
cluster_size<BR> avec:
first_data_sector_location: origine (adresse octet) du premier secteur de
donnnees <BR> au lieu de:<BR> len :
cluster_size - storage_location % cluster_size<BR> Ces deux formules
divergent des que la taille d'un cluster est differente de celle d'un
secteur.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>9. Fonction
sos_fat_helper_get_next_directory_entry<BR> Certaines entrees ne
sont pas vues dans les conditions suivantes:<BR> - la taille du
cluster est strictement superieure a 1 (c'est a dire qu'un cluster
<BR> comprend au moins deux secteurs)<BR> -
la recherche dans le repertoire commence a partir du debut du
repertoire<BR> - l'entree du fichier cherche ne se situe pas dans le
premier secteur du repertoire<BR> Le probleme vient de la variable
"sector_rem" specifiant la premiere entree de repertoire a
explorer:</FONT></DIV>
<DIV><FONT face=Arial size=2> Elle est en fait relative a un
secteur.<BR> Elle doit etre remise a zero des que l'exploration du premier
secteur est terminee, sinon, <BR> les "sector_rem" entrees du secteur
suivant sont occultees. </FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>10. Fonction
sos_fat_helper_find_free_directory_entry:<BR> Meme nature de probleme que
celui evoque en (9)<BR> Ici, il ne s'agit pas a proprement parler d'un
probleme, puisque les conditions necessaires <BR> a son apparition ne sont
jamais remplies dans la realisation actuelle.</FONT></DIV>
<DIV><FONT face=Arial size=2> Une correction a neanmoins ete
apporte avec le patch joint.<BR> <BR> 11. Fonction
sos_fat_helper_remove_all_cluster:<BR> Une operation
excedentaire de mise a jour de FAT est declenchee.<BR> Le
cluster implique, s'il etait licite, serait celui correpondant au code de fin de
<BR> cluster (cluster numero 0xFFF8, dans le cas de FAT
16)<BR> Generalement cette operation provoque une
alteration de la seconde FAT, ou des donnnes utiles
...<BR> <BR></FONT><FONT face=Arial size=2></FONT></DIV>
<DIV><FONT face=Arial size=2>Christian Guerineau</FONT></DIV>
<DIV><FONT face=Arial size=2>Ci joint: patch corrigeant les problemes ci dessus
evoques.</FONT></DIV>
<DIV><FONT face=Arial size=2> </DIV></FONT></BODY></HTML>