OVH Cloud OVH Cloud

NFS, mmap

1 réponse
Avatar
DINH Viêt Hoà
J'ai un petit problème avec les mmap() sur NFS.

description de la séquence
(tout se passe sur le même système de fichier NFS) :

void ecrire_fichier(char * contenu, size_t taille)
{
char fichier1[PATH_MAX];
int fd;
char * fichier2;
char * fichier3;

snprintf(fichier1, sizeof(fichier1), "toto-XXXXX");
fd = mkstemp(fichier1);

ftruncate(fd, taille);
mapping = mmap(NULL, taille, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

memcpy(mapping, contenu, taille);

msync(mapping, taille, MS_SYNC);
munmap(mapping, taille);

close(fd);

fichier2 = ... ; /* nom de fichier dans le même
répertoire que fichier 1 */

link(fichier1, fichier2);
unlink(fichier1);

fichier3 = ... ; /* nom de fichier dans un répertoire différent du
fichier 2 mais toujours sur le même système de
fichier NFS */

link(fichier2, fichier3);
unlink(fichier2);
}

le problème est qu'en lisant fichier2 (avec mmap() toujours), de temps en
temps, je lis un fichier de la bonne taille mais uniquement rempli de
zéro, et quand je le déplace, je me retrouve de nouveau avec ses données.

Ceci, sur linux 2.4.22, pour le client et le serveur NFS.

Est-ce un problème connu ? Y-a-t-il une solution connue pour ce risque
potentiel de corruption de données ?

--
DINH V. Hoa,

"un esprit sain dans un corps sain" -- voisin

1 réponse

Avatar
DINH Viêt Hoà

Est-ce un problème connu ? Y-a-t-il une solution connue pour ce risque
potentiel de corruption de données ?


apparemment, si on met l'option no_subtree_check dans /etc/exports, cela
donne une comportement normal et désactive le mode "corruption de données"
dans NFS.

(Le même problème existait avec ccache)

--
DINH V. Hoa,

"un esprit sain dans un corps sain" -- voisin