#include #include #include #include #include #include #include #include struct transfer_range{ __u32 dest_fd; __u32 start_block; __u32 length; }; #define EXT4_IOC_TRANSFER_BLOCK_RANGE _IOW('f', 19, struct transfer_range) int main(int argc, char ** argv) { int dfd, fd; struct transfer_range tr; if(argc != 5){ printf("Usage: \n"); return 0; } memset(&tr, 0, sizeof(struct transfer_range)); tr.start_block = atoi(argv[3]); tr.length = atoi(argv[4]); fd = open(argv[1],O_RDWR ,0666); if (!fd) { printf("Cannot open source file\n"); _exit(1); } dfd = open(argv[2],O_RDWR|O_CREAT ,0666); if (!dfd) { printf("Cannot open dest file\n"); _exit(1); } tr.dest_fd = dfd; ioctl(fd, EXT4_IOC_TRANSFER_BLOCK_RANGE, &tr); close(fd); close(dfd); perror("Return:\n"); return 0; }