IOCTL_GETFSMAP(2) Manuel du programmeur Linux IOCTL_GETFSMAP(2)

ioctl_getfsmap - récupérer la topographie physique du système de fichiers

#include <sys/ioctl.h>
#include <linux/fs.h>
#include <linux/fsmap.h>
int ioctl(int fd, FS_IOC_GETFSMAP, struct fsmap_head * arg);

Cette opération ioctl(2) récupère les plans de domaine (extent) d'un système de fichiers. Ces informations peuvent être utilisées, entre autres, pour rechercher les fichiers associés à un bloc physique, analyser l'espace libre, ou chercher les blocs connus comme défectueux.

Le seul paramètre de cette opération doit être un pointeur vers une struct fsmap_head unique :


struct fsmap {
    __u32 fmr_device;      /* ID périphérique */
    __u32 fmr_flags;       /* Attributs de plan */
    __u64 fmr_physical;    /* Adresse du segment de périphérique */
    __u64 fmr_owner;       /* ID du propriétaire */
    __u64 fmr_offset;      /* Adresse du segment de fichier */
    __u64 fmr_length;      /* Longueur du segment */
    __u64 fmr_reserved[3]; /* Obligatoirement à zéro */
};
struct fsmap_head {
    __u32 fmh_iflags;       /* Attributs de contrôle */
    __u32 fmh_oflags;       /* Attributs de sortie */
    __u32 fmh_count;        /* # of entries in array incl. input */
    __u32 fmh_entries;      /* Nb d’entrées remplies (sortie) */
    __u64 fmh_reserved[6];  /* Obligatoirement à zéro */
    struct fsmap fmh_keys[2];  /* Clés basse et haute pour
                                  la recherche de plan */
    struct fsmap fmh_recs[];   /* Enregistrements renvoyés */
};

Les deux éléments de tableau fmh_keys indiquent la clé la plus basse et la plus haute pour laquelle l'application veut les informations du plan physique par rétro-représentation. Une clé de rétro-représentation (« retro-mapping key ») consiste dans la séquence (périphérique, bloc, propriétaire, position). Les champs du propriétaire et de la position font partie de la clé car certains systèmes de fichiers prennent en charge le partage de blocs physiques entre plusieurs fichiers, ils peuvent donc renvoyer plusieurs associations pour un bloc physique donné.

Les plans des systèmes de fichiers sont copiés dans un tableau fmh_recs, qui suit immédiatement les données d'en-tête.

Le champ fmh_iflags est un masque de bit passé au noyau pour modifier la sortie. Aucun attribut n'est actuellement défini, l'appelant doit donc positionner cette valeur à zéro.

Le champ fmh_oflags est un masque de bit d'attributs positionnés par le noyau concernant les plans renvoyés. Si FMH_OF_DEV_T est positionné, le champ fmr_device représente une structure dev_t contenant les numéros majeur et mineur du périphérique bloc.

Le champ fmh_count contient le nombre d'éléments du tableau à passer au noyau. Si cette valeur vaut 0, fmh_entries sera positionné au nombre d'enregistrements qui auraient été renvoyés avec un tableau plus grand ; aucune information de plan ne sera renvoyée.

Le champ fmh_entries contient le nombre d'éléments du tableau fmh_recs qui contiennent des informations utiles.

Le champ fmh_reserved doit être positionné à zéro.

Les deux enregistrements de clés fsmap_head.fmh_keys indiquent les enregistrements de domaines le plus bas et le plus haut de l'espace de clés (keyspace) pour lequel l'appelant a demandé le renvoi. Un système de fichiers qui peut partager des blocs entre les fichiers exige probablement la série (device, physical, owner, offset, flags) pour n'indexer que les enregistrements de plan de système de fichiers. Les systèmes de fichiers classiques qui ne permettent pas ce partage pourraient identifier n'importe quel enregistrement avec uniquement (device, physical, flags). Par exemple, si la clé basse est positionnée sur (8:0, 36864, 0, 0, 0), le système de fichiers ne renverra que les enregistrements des domaines commençant ou se trouvant après 36 Kio sur le disque. Si la clé haute est positionnée sur (8:0, 1048576, 0, 0, 0), seuls les enregistrements inférieurs à 1 Mio seront renvoyés. Le format de fmr_device dans les clés doit correspondre au format de ces mêmes champs dans les enregistrements de sortie, comme défini ci-dessous. Par convention, le champ fsmap_head.fmh_keys[0] doit contenir la clé basse et le champ fsmap_head.fmh_keys[1] la clé haute pour la requête.

Par commodité, si fmr_length est positionné dans la clé basse, il sera ajouté en fonction à fmr_block ou à fmr_offset. L'appelant peut tirer parti de cette subtilité en positionnant les appels suivants à travers la copie de fsmap_head.fmh_recs[fsmap_head.fmh_entries - 1] dans la clé basse. La fonction fsmap_advance (définie dans linux/fsmap.h) fournit cette possibilité.

Le champ fmr_device identifie uniquement le périphérique de stockage sous-jacent. Si l'attribut FMH_OF_DEV_T est positionné dans le champ fmh_oflags de l'en-tête, ce champ contient un dev_t à partir duquel les numéros majeur et mineur peuvent être extraits. Si l'attribut n'est pas positionné, ce champ contient une valeur qui doit être unique pour chaque périphérique de stockage.

Le champ fmr_physical contient l'adresse sur le disque du domaine en octets.

Le champ fmr_owner contient le propriétaire du domaine. Il s'agit d'un numéro d'inœud, sauf si FMR_OF_SPECIAL_OWNER est positionné dans le champ fmr_flags, auquel cas la valeur est déterminée par le système de fichiers. Voir la section ci-dessous concernant les valeurs du propriétaire pour plus de détails.

Le champ fmr_offset contient l'adresse logique sur l'enregistrement du plan en octets. Ce champ n'a aucun sens si les attributs FMR_OF_SPECIAL_OWNER ou FMR_OF_EXTENT_MAP sont positionnés dans fmr_flags.

Le champ fmr_length contient la longueur du domaine en octets.

Le champ fmr_flags est un masque de bit des attributs d'état du domaine. Les bits sont :

FMR_OF_PREALLOC
Le domaine est alloué mais pas encore écrit.
FMR_OF_ATTR_FORK
Ce domaine contient des données d'attributs étendus.
FMR_OF_EXTENT_MAP
Ce domaine contient des informations sur le plan de domaine pour le propriétaire.
FMR_OF_SHARED
Certaines parties de ce domaine peuvent être partagées.
FMR_OF_SPECIAL_OWNER
Le champ fmr_owner contient une valeur spéciale et non un numéro d'inœud.
FMR_OF_LAST
Il s'agit du dernier enregistrement du jeu de données.

Le champ fmr_reserved sera positionné à zéro.

Généralement, la valeur du champ fmr_owner pour les domaines qui ne sont pas des métadonnées devrait être un numéro d'inœud. Cependant, les systèmes de fichiers ne sont pas obligés de signaler les numéros d'inœud ; ils peuvent plutôt renvoyer FMR_OWN_UNKNOWN si le numéro d'inœud ne peut pas être récupéré facilement, si l'appelant n'a pas assez de privilèges, si le système de fichiers ne gère pas les numéros d'inœud stables, ou pour toute autre raison. Si un système de fichiers souhaite conditionner l'envoi des numéros d'inœuds aux capacités du processus, il est fortement recommandé d'utiliser la capacité CAP_SYS_ADMIN à cette fin.
Les valeurs spéciales de propriétaire suivantes sont communes à tous les systèmes de fichiers :
FMR_OWN_FREE
Espace libre.
FMR_OWN_UNKNOWN
Ce domaine est utilisé mais son propriétaire n'est pas connu ou n’est pas facilement récupérable.
FMR_OWN_METADATA
Ce domaine est une métadonnée d'un système de fichiers.

XFS peut renvoyer les valeurs spéciales de propriétaire suivantes :

XFS_FMR_OWN_FREE
Espace libre.
XFS_FMR_OWN_UNKNOWN
Ce domaine est utilisé mais son propriétaire n'est pas connu ou n’est pas facilement récupérable.
XFS_FMR_OWN_FS
Les métadonnées de système de fichiers statiques qui existent à une adresse fixe. Il s'agit de superblocs AG et des en-têtes AGF, AGFL et AGI.
XFS_FMR_OWN_LOG
Le journal du système de fichiers.
XFS_FMR_OWN_AG
Métadonnées du groupe d'allocation telles que les btrees de l'espace libre ou du rétro-plan.
XFS_FMR_OWN_INOBT
L'inœud et les btrees de l'inœud libre.
XFS_FMR_OWN_INODES
Enregistrements de l'inœud.
XFS_FMR_OWN_REFC
Informations du compte de référence.
XFS_FMR_OWN_COW
Ce domaine est utilisé pour préparer une copie sur écriture.
XFS_FMR_OWN_DEFECTIVE:
Cette extension a été marquée comme étant défectueuse, soit par le système de fichiers, soit par le périphérique sous-jacent.

ext4 peut renvoyer les valeurs spéciales de propriétaire :

EXT4_FMR_OWN_FREE
Espace libre.
EXT4_FMR_OWN_UNKNOWN
Ce domaine est utilisé mais son propriétaire n'est pas connu ou n’est pas facilement récupérable.
EXT4_FMR_OWN_FS
Métadonnées du système de fichiers statiques qui existent à une adresse fixe. Il s'agit du superbloc et des descripteurs de groupe.
EXT4_FMR_OWN_LOG
Le journal du système de fichiers.
EXT4_FMR_OWN_INODES
Enregistrements de l'inœud.
EXT4_FMR_OWN_BLKBM
Plan de bit de bloc.
EXT4_FMR_OWN_INOBM
Plan de bit d'inœud.

En cas d'erreur, la valeur de retour est -1 et errno est définie pour préciser l'erreur.

L'erreur inscrite dans errno peut être, entre autres, une des suivantes :
EBADF
fd n'est pas ouvert en lecture.
EBADMSG
Le système de fichiers a détecté une erreur de somme de contrôle dans les métadonnées.
EFAULT
Le pointeur fourni ne correspond à aucune adresse mémoire valable.
EINVAL
Le tableau n'est pas assez long, les clés ne pointent pas vers une partie valable du système de fichiers, la clé basse pointe vers un point de l'espace d'adresses de stockage physique du système de fichiers plus élevé que la clé haute ou une valeur non nulle a été inscrite dans un champ qui doit contenir zéro.
ENOMEM
Pas assez de mémoire pour traiter la requête.
EOPNOTSUPP
Le système de fichiers ne prend pas en charge cette commande.
EUCLEAN
Les métadonnées du système de fichiers sont corrompues et doivent être réparées.

L'opération FS_IOC_GETFSMAP est apparue pour la première fois dans Linux 4.12.

Cette API est spécifique à Linux. Tous les systèmes de fichiers ne la gèrent pas.

Voir io/fsmap.c dans les xfsprogs pour un programme d'exemple.

ioctl(2)

Cette page fait partie de la publication 5.11 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page, peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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.

22 mars 2021 Linux