ioctl_fideduperange(2) System Calls Manual ioctl_fideduperange(2)

ioctl_fideduperange - partajează o parte din datele unui fișier cu un alt fișier

Biblioteca C standard (libc, -lc)

#include <linux/fs.h>      /* Definiția lui FIDEDUPERANGEși a
constantelor                              FILE_DEDUPE_* */
#include <sys/ioctl.h>
int ioctl(int src_fd, FIDEDUPERANGE, struct file_dedupe_range *arg);

În cazul în care un sistem de fișiere acceptă fișiere care partajează stocarea fizică între mai multe fișiere, această operație ioctl(2) poate fi utilizată pentru a face ca o parte din datele din fișierul src_fd să apară în fișierul dest_fd prin partajarea stocării subiacente dacă datele din fișiere sunt identice („deduplicare”). Ambele fișiere trebuie să se afle în același sistem de fișiere. Acest lucru reduce consumul de stocare permițând sistemului de fișiere să stocheze o singură copie partajată a datelor. În cazul în care o regiune partajată ar trebui să fie scrisă într-un fișier, sistemul de fișiere trebuie să se asigure că modificările rămân private pentru fișierul care este scris. Acest comportament este denumit în mod obișnuit „copiere la scriere”.

Acest ioctl efectuează operația de „comparare și partajare dacă este identică” pe până la src_length octeți din descriptorul de fișier src_fd la poziția src_offset. Această informație este transmisă într-o structură de următoarea formă:


struct file_dedupe_range {
;
    __u64 src_length;
    __u16 dest_count;
    __u16 reserved1;
    __u32 reserved2;
    struct file_dedupe_range_info info[0];
};

Deduplicarea este atomică în ceea ce privește scrierile simultane, astfel încât nu este nevoie să se facă niciun blocaj pentru a obține o copie deduplicată consistentă.

Câmpurile rezerved1 și rezerved2 trebuie să fie zero.

Destinațiile pentru operația de deduplicare sunt transmise în matricea de la sfârșitul structurii. Numărul de destinații este indicat în dest_count, iar informațiile privind destinația sunt transmise sub următoarea formă:


struct file_dedupe_range_info {
    __s64 dest_fd;
    __u64 dest_offset;
    __u64 bytes_deduped;
    __s32 status;
    __u32 reserved;
};

Fiecare operație de deduplicare vizează src_length octeți în descriptorul de fișier dest_fd la poziția dest_offset. Câmpul reserved trebuie să fie zero. În timpul apelului, src_fd trebuie să fie deschis pentru citire, iar dest_fd trebuie să fie deschis pentru scriere. Dimensiunea combinată a structurii matricei file_dedupe_range și a structurii matricei file_dedupe_range_info nu trebuie să depășească dimensiunea paginii de sistem. Dimensiunea maximă a src_length depinde de sistemul de fișiere și este de obicei de 16 Mio. Această limită va fi impusă în mod silențios de către sistemul de fișiere. Prin convenție, spațiul de stocare utilizat de src_fd este plasat în dest_fd, iar conținutul anterior din dest_fd este eliberat.

La finalizarea cu succes a acestui ioctl, numărul de octeți deduplicați cu succes este returnat în bytes_deduped și un cod de stare pentru operația de deduplicare este returnat în status. În cazul în care nici măcar un singur octet din interval nu corespunde, cererea de deduplicare va fi ignorată, iar status va fi stabilit la FILE_DEDUPE_RANGE_DIFFERS. Codul status este stabilit la FILE_DEDUPE_RANGE_SAME în caz de succes, un cod de eroare negativ în caz de eroare sau FILE_DEDUPE_RANGE_DIFFERS dacă datele nu se potrivesc.

În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

Posibilele erori includ (dar nu se limitează la) următoarele:

src_fd nu este deschis pentru citire; dest_fd nu este deschis pentru scriere sau este deschis doar pentru scriere de tip „doar-adăugare”; sau sistemul de fișiere pe care se află src_fd nu acceptă deduplicarea.
Sistemul de fișiere nu acceptă deduplicarea intervalelor de fișiere date. Această eroare poate apărea, de asemenea, dacă oricare dintre descriptorii de fișiere reprezintă un dispozitiv, FIFO sau soclu. În general, sistemele de fișiere pe disc necesită ca argumentele „offset” și „length” să fie aliniate la dimensiunea blocului fundamental. Nici Btrfs și nici XFS nu acceptă suprapunerea intervalelor de deduplicare în același fișier.
Unul dintre fișiere este un director, iar sistemul de fișiere nu acceptă regiuni partajate în directoare.
Nucleul nu a reușit să aloce suficientă memorie pentru a efectua operația sau dest_count este atât de mare încât descrierea argumentului de intrare se întinde pe mai mult de o singură pagină de memorie.
Acest lucru poate apărea în cazul în care sistemul de fișiere nu acceptă deduplicarea niciunui descriptor de fișier sau în cazul în care unul dintre descriptorii de fișiere se referă la noduri-i speciale.
dest_fd este imuabil.
Unul dintre fișiere este un fișier swap. Fișierele swap nu pot partaja spațiul de stocare.
dest_fd și src_fd nu se află pe același sistem de fișiere montat.

Unele sisteme de fișiere pot limita cantitatea de date care pot fi deduplicate într-un singur apel.

Linux.

Linux 4.5.

A fost cunoscută anterior sub numele de BTRFS_IOC_FILE_EXTENT_SAME și a fost privată pentru Btrfs.

Deoarece o operație de copiere la scriere „copy-on-write” necesită alocarea de noi spații de stocare, operația fallocate(2) poate să nu partajeze blocurile partajate pentru a garanta că scrierile ulterioare nu vor eșua din cauza lipsei de spațiu pe disc.

ioctl(2)

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

31 octombrie 2023 Pagini de manual de Linux 6.06