fallocate(2) System Calls Manual fallocate(2) NOM fallocate - Manipuler un espace de fichier BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #define _GNU_SOURCE /* Consultez feature_test_macros(7) */ #include int fallocate(int fd, int mode, off_t offset, off_t len); DESCRIPTION C'est un appel systeme specifique a Linux et non portable. Pour la methode portable, specifiee par POSIX.1, pour assurer que de l'espace est alloue pour un fichier, consultez posix_fallocate(3). fallocate() permet a l'appelant de manipuler directement l'espace disque alloue pour le fichier reference par fd pour la plage d'octets debutant a offset et de longueur len octets. Le parametre mode definit l'operation a effectuer sur la plage donnee. Les sous-sections suivantes apportent des precisions sur les operations prises en charge. Allocation d'espace disque. L'operation par defaut (c'est-a-dire si mode est zero) de fallocate() alloue l'espace disque dans l'intervalle indique par offset et len. La taille du fichier (comme indiquee par stat(2)) sera modifiee si offset+len est superieur a la taille du fichier. Toute sous-region dans l'intervalle indique par offset et len sera initialisee a zero si elle ne contient pas de donnees au moment de l'appel. Ce comportement par defaut ressemble beaucoup au comportement de la fonction de bibliotheque posix_fallocate(3), et est concu comme une methode d'implementation optimisee de cette fonction. Apres un appel reussi, les ecritures suivantes dans l'intervalle indique par offset et len seront garanties sans echec du a un manque d'espace disque. Si l'attribut FALLOC_FL_KEEP_SIZE est indique dans mode, le comportement de l'appel est similaire, mais la taille du fichier ne sera pas modifiee si offset+len est superieur a la taille du fichier. L'allocation prealable de blocs mis a zero apres la fin du fichier de cette facon permet d'optimiser la charge de travail d'ajout. Si l'attribut FALLOC_FL_UNSHARE est indique dans mode, les extensions de donnees du fichier partage seront privees pour le fichier afin de garantir que l'ecriture suivante n'echouera pas du fait d'un manque d'espace. Generalement, cela se fera par une operation copy-on-write sur toutes les donnees partagees du fichier. Cet attribut peut ne pas etre pris en charge par tous les systemes de fichiers. Parce que l'allocation est effectuee en fragments de taille de blocs, fallocate() peut allouer un espace de disque plus grand que celui qui a ete indique. Desallocation d'espace de fichier Indiquer le parametre FALLOC_FL_PUNCH_HOLE (disponible depuis Linux 2.6.38) dans mode desalloue l'espace (c'est-a-dire cree un trou) dans l'intervalle d'octets commencant a offset et continuant pendant len octets. Dans l'espace indique, les blocs incomplets du systeme de fichiers sont mis a zero et tous les blocs du systeme de fichiers sont retires du fichier. Apres un appel reussi, les lectures suivantes dans cet intervalle renverront des zeros. Le parametre FALLOC_FL_PUNCH_HOLE doit etre inclus avec FALLOC_FL_KEEP_SIZE dans mode (avec un OU binaire) ; autrement dit, meme en faisant des trous apres la fin du fichier, la taille du fichier (comme indiquee par stat(2)) ne changera pas. Les systemes de fichiers ne prennent pas tous FALLOC_FL_PUNCH_HOLE en charge ; si un systeme de fichiers n'accepte pas l'operation, une erreur est renvoyee. L'operation est prise en charge notamment par les systemes de fichiers suivants : - XFS (depuis Linux 2.6.38) - ext4 (depuis Linux 3.0) - Btrfs (depuis Linux 3.7) - tmpfs(5) (depuis Linux 3.5) - gfs2(5) (depuis Linux 4.16) Reduction d'espace de fichier Indiquer le parametre FALLOC_FL_COLLAPSE_RANGE (disponible depuis Linux 3.15) dans mode supprime un intervalle d'octets d'un fichier sans laisser de trou. L'intervalle commence a offset et continue pendant len octets. Une fois l'operation terminee, le contenu du fichier au-dela de offset+len est deplace a l'emplacement offset, le fichier sera alors len octets plus court. Un systeme de fichiers peut limiter la granularite de l'operation, pour garantir une implementation efficace. Typiquement, offset et len doivent etre multiples de la taille de bloc du systeme de fichiers, qui est en fonction du type de systeme de fichiers et de sa configuration. Si cette exigence est applicable au systeme de fichiers mais n'est pas remplie, fallocate() echouera avec l'erreur EINVAL. Si la plage definie par offset et len atteint ou depasse la fin du fichier, une erreur est renvoyee. Le fichier devrait etre tronque avec ftruncate(2). Aucun autre attribut de ne peut etre indique dans mode en plus de FALLOC_FL_COLLAPSE_RANGE. Linux 3.15 prend en charge FALLOC_FL_COLLAPSE_RANGE pour ext4 (seulement pour les fichiers a base de domaines ou << extent >>) et XFS. Initialisation d'espace de fichier Indiquer le parametre FALLOC_FL_ZERO_RANGE (disponible depuis Linux 3.15) dans mode met a zero l'espace dans l'intervalle d'octets commencant a offset et continuant pendant len octets. Dans l'intervalle indique, les blocs sont prealloues pour les zones qui couvrent les trous du fichier. Apres un appel reussi, les lectures suivantes dans cet intervalle renverront des zeros. L'initialisation est realisee dans le systeme de fichiers de preference en convertissant l'intervalle en << extents >> non ecrits. Cette approche signifie que l'intervalle indique ne sera pas physiquement initialise sur le peripherique (a part les blocs partiels aux extremites de l'intervalle) et qu'une entree ou sortie n'est (sinon) necessaire que pour mettre a jour les metadonnees. Si l'attribut FALLOC_FL_KEEP_SIZE est egalement indique dans mode, le comportement de l'appel est similaire, mais la taille du fichier ne sera pas modifiee si offset+len est superieur a la taille du fichier. Le comportement est le meme lorsque de l'espace est prealloue et que FALLOC_FL_KEEP_SIZE est indique. Les systemes de fichiers ne prennent pas tous FALLOC_FL_ZERO_RANGE en charge ; si un systeme de fichiers n'accepte pas l'operation, une erreur est renvoyee. L'operation est prise en charge notamment par les systemes de fichiers suivants : - XFS (depuis Linux 3.15) - ext4, pour les fichiers a base de domaines (<< extent >>) (depuis Linux 3.15) - SMB3 (depuis Linux 3.17) - Btrfs (depuis Linux 4.16) Augmenter l'espace de fichier Indiquer le parametre FALLOC_FL_INSERT_RANGE (disponible depuis Linux 4.1) dans mode augmente l'espace d'un fichier en inserant un trou dans la taille du fichier sans effacer de donnees. Le trou commencera a offset et continuera pendant len octets. Lors de l'insertion d'un trou dans un fichier, le contenu du fichier a partir de offset sera decale vers le haut (a savoir vers la position du fichier superieure) de len octets. L'insertion d'un trou dans un fichier augmente sa taille de len octets. Ce mode a les memes limites que FALLOC_FL_COLLAPSE_RANGE concernant la granularite des operations. Si les exigences de granularite ne sont pas satisfaites, fallocate() echoue avec l'erreur EINVAL. Si offset est egal ou superieur a la fin du fichier, une erreur est renvoyee. Pour de telles operations (a savoir l'insertion d'un trou a la fin du fichier), ftruncate(2) doit etre utilise. Aucun autre attribut ne peut etre indique dans mode en plus de FALLOC_FL_INSERT_RANGE. FALLOC_FL_INSERT_RANGE requiert une prise en charge par le systeme de fichiers. Les systemes de fichiers qui gerent cette operation comprennent XFS (dans Linux 4.1) et ext4 (depuis Linux 4.2). VALEUR RENVOYEE En cas de succes, fallocate() renvoie 0. En cas d'erreur, -1 est renvoye et errno contient le code d'erreur. ERREURS EBADF fd n'est pas un descripteur de fichier valable ou n'est pas ouvert en ecriture. EFBIG offset+len excede la taille maximale du fichier. EFBIG mode vaut FALLOC_FL_INSERT_RANGE et la taille du fichier + len depasse la taille maximale du fichier. EINTR Un signal a ete capture pendant l'execution ; voir signal(7). EINVAL offset etait inferieur a 0, ou len etait inferieur ou egal a 0. EINVAL mode vaut FALLOC_FL_COLLAPSE_RANGE et la plage indiquee par offset et len atteint ou depasse la fin du fichier. EINVAL mode vaut FALLOC_FL_INSERT_RANGE et la plage indiquee par offset atteint ou depasse la fin du fichier. EINVAL mode vaut FALLOC_FL_COLLAPSE_RANGE ou FALLOC_FL_INSERT_RANGE, mais offset ou len n'est pas un multiple de la taille du bloc du systeme de fichiers. EINVAL mode contient FALLOC_FL_COLLAPSE_RANGE ou FALLOC_FL_INSERT_RANGE ainsi que d'autres attributs, mais aucun autre attribut n'est autorise avec FALLOC_FL_COLLAPSE_RANGE ou FALLOC_FL_INSERT_RANGE. EINVAL mode vaut FALLOC_FL_COLLAPSE_RANGE, FALLOC_FL_ZERO_RANGE ou FALLOC_FL_INSERT_RANGE,, mais le fichier reference par fd n'est pas un fichier normal. EIO Une erreur d'entree-sortie s'est produite durant la lecture ou l'ecriture sur un systeme de fichiers. ENODEV fd ne fait pas reference a un fichier regulier ou un repertoire (si fd est un tube ou une FIFO, une erreur differente en resultera). ENOSPC Il n'y a pas suffisamment d'espace disponible sur le peripherique ou se trouve le fichier reference par fd. ENOSYS Ce noyau ne met pas en oeuvre fallocate(). EOPNOTSUPP Le systeme de fichiers contenant le fichier reference par fd ne gere pas cette operation, ou le mode n'est pas pris en charge par le systeme de fichiers contenant le fichier reference par fd. EPERM Le fichier auquel se refere fd est marque comme immuable (voir chattr(1)). EPERM mode indique FALLOC_FL_PUNCH_HOLE, FALLOC_FL_COLLAPSE_RANGE ou FALLOC_FL_INSERT_RANGE et le fichier auquel se refere fd est marque en ajout uniquement (consulter chattr(1)). EPERM La lecture a ete interrompue par un signal ; consultez fnctl(2). ESPIPE fd fait reference a un tube ou une FIFO. ETXTBSY mode indique FALLOC_FL_COLLAPSE_RANGE ou FALLOC_FL_INSERT_RANGE, mais le fichier reference par fd est en cours d'execution. STANDARDS Linux. HISTORIQUE fallocate() Linux 2.6.23, glibc 2.10. FALLOC_FL_* glibc 2.18. VOIR AUSSI fallocate(1), ftruncate(2), posix_fadvise(3), posix_fallocate(3) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 fallocate(2)