Клонировать файл в linux модуль ядра - PullRequest
0 голосов
/ 13 марта 2020

У меня проблема с модулем linux, я хочу клонировать файл из файлового дескриптора. Я пытался использовать

vfs_clone_file_range

, но я получаю ошибку EOPNOTSUPP. Поэтому я попытался использовать vfs_copy_file_range, и копия работает правильно, но мне нужно иметь также те же флаги оригинала, но таким образом, даже если оригинал открыт с O_APPEND, указатель копии всегда находится в начале файла.

Это мой код:

//The file descriptor is taken correctly and it works
original_filp = fcheck(o_fd);
copy_filp = filp_open(addr, O_CREAT | O_RDWR  , 0644);
vfs_copy_file_range(original_filp, 0, copy_filp, 0, i_size_read(original_filp->f_inode), 0);

Содержимое правильное, но указатель, как я уже сказал, находится в начале даже с флагом O_APPEND, поэтому я должен двигаться указатель явно. Я также пытался добавить эту строку, но безрезультатно:

copy_filp->f_pos = original_filp->f_pos;

Я действительно понятия не имею, что нужно изменить, чтобы заставить его работать. Заранее благодарю за помощь

1 Ответ

1 голос
/ 31 марта 2020

Я не знаю, получу ли я его, но согласно документации, copy_file_range возвращает код ошибки EBADF, когда для file_out установлен O_APPEND. Таким образом, способ решения может быть следующим:

//The file descriptor is taken correctly and it works
original_filp = fcheck(o_fd);
copy_filp = filp_open(addr, O_CREAT | O_RDWR  , 0644);
vfs_copy_file_range(original_filp, 0, copy_filp, 0, `i_size_read(original_filp->f_inode), 0);`
copy_filp->f_flags=original_filp->f_flags

Таким образом, у вас есть одинаковые флаги для двух файлов

...