ioctl_fideduperange(2) | System Calls Manual | ioctl_fideduperange(2) |
ioctl_fideduperange - partager les données d'un fichier avec un autre fichier
Bibliothèque C standard (libc, -lc)
#include <linux/fs.h> /* Définition des constantes FIDEDUPERANGE
et FILE_DEDUPE_* */ #include <sys/stat.h>
int ioctl(int src_fd, FIDEDUPERANGE, struct file_dedupe_range *arg);
Si un système de fichiers prend en charge le stockage physique du partage de fichiers entre plusieurs fichiers (« reflink »), cette opération ioctl(2) peut être utilisée pour faire apparaître des données du fichier src_fd dans le fichier dest_fd en partageant le stockage sous-jacent, si les données du fichier sont identiques (« déduplication »). Les deux fichiers doivent se trouver sur le même système de fichiers. Cela réduit la consommation en stockage en permettant au système de ne stocker qu'une copie partagée des données. Si une écriture de fichier doit avoir lieu sur une région partagée, le système de fichiers doit garantir que les modifications n’appartiennent qu’au fichier qui est écrit. On appelle généralement ce comportement la « copie sur écriture ».
Cet ioctl accomplit l'opération « comparer et partager si identique » jusqu'à src_lenght octets du descripteur de fichier src_fd décalé de src_offset. Cette information est communiquée dans une structure de la forme suivante :
struct file_dedupe_range {
__u64 src_offset;
__u64 src_length;
__u16 dest_count;
__u16 reserved1;
__u32 reserved2;
struct file_dedupe_range_info info[0]; };
La déduplication est atomique par rapport aux écritures concomitantes, vous n'avez donc pas besoin de poser de verrous pour avoir une copie dédupliquée cohérente.
Les champs reserved1 et reserved2 doivent valoir zéro.
Les destinations de l'opération de déduplication se placent dans un tableau à la fin de la structure. Le nombre de destinations est donné dans dest_count et les informations sur la destination sont transmises sous la forme suivante :
struct file_dedupe_range_info {
__s64 dest_fd;
__u64 dest_offset;
__u64 bytes_deduped;
__s32 status;
__u32 reserved; };
Chaque opération de déduplication envoie src_length octets dans le descripteur de fichier dest_fd à la position dest_offset. Le champ reserved doit valoir zéro. Pendant l'appel, src_fd doit être ouvert en lecture et dest_fd en écriture. La taille combinée du tableau des structures file_dedupe_range et file_dedupe_range_info ne doit pas dépasser la taille de la page du système. La taille maximale de src_length dépend du système de fichiers et est généralement de 16 Mio. Cette limite sera augmentée silencieusement par le système de fichiers. Par convention, le stockage utilisé par src_fd est associé à dest_fd et le contenu précédent de dest_fd est libéré.
En cas de succès de cet ioctl, le nombre d'octets dédupliqués avec succès est renvoyé dans bytes_deduped et un code de retour de l'opération de déduplication est renvoyé dans status. Si un seul octet de la plage ne correspond pas, la demande de déduplication sera ignorée et status sera positionné sur FILE_DEDUPE_RANGE_DIFFERS. Le code de status est positionné sur FILE_DEDUPE_RANGE_SAME en cas de succès, sur un code d'erreur négatif en cas d'erreur, ou sur FILE_DEDUPE_RANGE_DIFFERS si les données ne correspondaient pas.
En cas d'erreur, la valeur de retour est -1 et errno est définie pour préciser l'erreur.
Les codes d'erreur possibles comprennent, entre autres, les suivants :
Cette opération ioctl est apparue pour la première fois dans Linux 4.5. Elle était précédemment connue sous le nom BTRFS_IOC_FILE_EXTENT_SAME et elle était réservée à Btrfs.
Cette API est spécifique à Linux.
Une opération de copie sur écriture nécessitant l'allocation d'un nouveau stockage, l'opération fallocate(2) peut ne plus partager les blocs partagés pour garantir que les écritures suivantes n'échoueront pas du fait d'un manque d'espace disque.
Certains systèmes de fichiers peuvent limiter la quantité de données qui peut être dédupliquée dans un seul appel.
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
30 octobre 2022 | Pages du manuel de Linux 6.03 |