Mein Problem ist es, mit Lesevorgänge sparse Datei umzugehen und zu verstehen, wo die Extents der Datei einige Logik um es ausführen sollen.So verwenden Sie ioctl mit FS_IOC_FIEemap
Da es keinen direkten API-Aufruf gibt, um diese Dinge herauszufinden, entschied ich mich dafür, ioctl api zu verwenden. Ich kam auf die Idee, wie der cp-Befehl mit Problemen beim Kopieren über Sparse-Dateien umgeht, indem er ihren Code durchgeht und dies schließlich sah.
Also habe ich versucht, die gleiche Sache in meinem Beispielprogramm zu tun, im User-Space laufen und es Fehler heraus mit „Invalid argument“. Ich bin mir nicht sicher, was ich vermisse oder ob das überhaupt aus dem Userspace möglich ist. Ich laufe auf Ubuntu 14.04 auf einem ext4 Dateisystem. Könnte dies ein Problem mit dem Gerätetreiber sein, der diese Anforderungsmodi darunter unterstützt?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include "fiemap.h" //This is from https://github.com/coreutils/coreutils/blob/df88fce71651afb2c3456967a142db0ae4bf9906/src/fiemap.h
int main(int argc, char* argv[]) {
int input_fd;
if(argc != 2){
printf ("Usage: ioctl file1");
return 1;
}
/* Create input file descriptor */
input_fd = open (argv [1], O_RDWR);
if (input_fd < 0) {
perror ("open");
return 2;
}
union { struct fiemap f; char c[4096]; } fiemap_buf;
struct fiemap *fiemap = &fiemap_buf.f;
int s = ioctl(input_fd, FS_IOC_FIEMAP, fiemap);
if (s == 0) {
printf("ioctl success\n");
} else {
printf("ioctl failure\n");
char * errmsg = strerror(errno);
printf("error: %d %s\n", errno, errmsg);
}
/* Close file descriptors */
close (input_fd);
return s;
}
Initialisierung der Fiemap funktioniert! Vielen Dank! – Aila