table of contents
ioctl_fideduperange(2) | System Calls Manual | ioctl_fideduperange(2) |
NUME¶
ioctl_fideduperange - partajează o parte din datele unui fișier cu un alt fișier
BIBLIOTECA¶
Biblioteca C standard (libc, -lc)
SINOPSIS¶
#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);
DESCRIERE¶
Î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; };
Each deduplication operation targets src_length bytes in file descriptor dest_fd at offset dest_offset. The field reserved must be zero. During the call, src_fd must be open for reading and dest_fd must be open for writing. The combined size of the struct file_dedupe_range and the struct file_dedupe_range_info array must not exceed the system page size. The maximum size of src_length is filesystem dependent and is typically 16 MiB. This limit will be enforced silently by the filesystem. By convention, the storage used by src_fd is mapped into dest_fd and the previous contents in dest_fd are freed.
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, operația 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.
VALOAREA RETURNATö
În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.
ERORI-IEȘIRE¶
Posibilele erori includ (dar nu se limitează la) următoarele:
- EBADF
- 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.
- EINVAL
- 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.
- EISDIR
- Unul dintre fișiere este un director, iar sistemul de fișiere nu acceptă regiuni partajate în directoare.
- ENOMEM
- 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.
- EOPNOTSUPP
- 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.
- EPERM
- dest_fd este imuabil.
- ETXTBSY
- Unul dintre fișiere este un fișier swap. Fișierele swap nu pot partaja spațiul de stocare.
- EXDEV
- dest_fd și src_fd nu se află pe același sistem de fișiere montat.
VERSIUNI¶
Unele sisteme de fișiere pot limita cantitatea de date care pot fi deduplicate într-un singur apel.
STANDARDE¶
Linux.
ISTORIC¶
Linux 4.5.
A fost cunoscută anterior sub numele de BTRFS_IOC_FILE_EXTENT_SAME și a fost privată pentru Btrfs.
NOTE¶
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.
CONSULTAȚI ȘI¶
TRADUCERE¶
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.
2 mai 2024 | Pagini de manual Linux (nepublicate) |