ioctl_ficlonerange(2)

NUME
ioctl_ficlonerange, ioctl_ficlone - partajarea unor date dintr-un fișier cu un alt fișier

BIBLIOTECA
Biblioteca C standard (libc, -lc)

REZUMAT
#include <linux/fs.h>        /* Definirea constantelor FICLONE* */
#include <sys/ioctl.h>

int ioctl(int dest_fd, FICLONERANGE, struct file_clone_range *arg);
int ioctl(int dest_fd, FICLONE, int src_fd);

DESCRIERE
În cazul în care un sistem de fișiere acceptă fișiere care partajează stocarea fizică între mai multe fișiere („reflink”), această operațiune 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, ceea ce este mai rapid decât realizarea unei copii fizice separate a datelor. Ambele fișiere trebuie să se afle în același sistem de fișiere. În cazul în care ar trebui să aibă loc o scriere a unui fișier într-o regiune partajată, 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 „reflink” clonează până la src_length octeți din descriptorul de fișier src_fd la poziția src_offset în fișierul dest_fdd la poziția dest_offset, cu condiția ca ambele să fie fișiere. În cazul în care src_length este zero, ioctl „reflink” clonează la sfârșitul fișierului sursă. Această informație este transmisă într-o structură de următoarea formă:

    struct file_clone_range {
        __s64 src_fd;
        __u64 src_offset;
        __u64 src_length;
        __u64 dest_offset;
    };

Clonele sunt atomice în ceea ce privește scrierile simultane, astfel încât nu este necesar să se ia nicio blocare pentru a obține o copie clonată consistentă.

Ioctl-ul FICLONE clonează fișiere întregi.

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

ERORI
Codurile de eroare pot fi unul dintre următoarele, dar nu se limitează la acestea:

EBADF
    src_fd nu este deschis pentru citire; dest_fd nu este deschis pentru scriere sau este deschis doar pentru scriere de tip „append-only” (doar-adăugare); sau sistemul de fișiere pe care se află src_fd nu acceptă „reflink”.

EINVAL
    Sistemul de fișiere nu suportă clonarea „reflink” între intervalele 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 de pe discuri cer ca argumentele „offset” (poziție) și „length” (lungime) să fie aliniate la dimensiunea blocului fundamental. XFS și Btrfs nu acceptă suprapunerea intervalelor de clonare „reflink” în același fișier.

EISDIR
    Unul dintre fișiere este un director, iar sistemul de fișiere nu acceptă regiuni partajate în directoare.

EOPNOTSUPP
    Acest lucru poate apărea în cazul în care sistemul de fișiere nu acceptă clonarea „reflink” cu oricare dintre descriptorii de fișiere sau în cazul în care oricare 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.

STANDARDE
Linux.

ISTORIC
Linux 4.5.

Acestea erau cunoscute anterior sub numele de BTRFS_IOC_CLONE și BTRFS_IOC_CLONE_RANGE și erau private 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
ioctl(2)

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

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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.