Мне нужно заменить файл другим в VFS (имеющем оба файла структуры) в модуле ядра Linux. Я попробовал 2 способа сделать это, но у обоих есть некоторые проблемы. Таким образом, у меня правильно инициализированы 2 файла, первое решение было:
vfs_truncate(&filp_one->f_path, 0);
err = vfs_copy_file_range(filp_two, 0, filp_one, 0, file_size, 0);
, где file_size - это размер filp_two, мне нужно усечь, потому что, если размер filp_one больше, чем filp_two, у меня может быть грязная копия , В этом случае проблема заключается в том, что другой процесс может изменить файл между двумя операциями, и если я попытаюсь заблокировать с помощью:
inode_lock(filp_one->f_inode);
vfs_truncate(&filp_one->f_path, 0);
err = vfs_copy_file_range(filp_two, 0, filp_one, 0, file_size, 0);
inode_unlock(filp_one->f_inode);
, результатом будет тупик.
Другое решение и, может быть, лучше, я думал, переименовать filp_two и затем отсоединить.
vfs_rename(parent, filp_two_dentry , parent, filp_one_dentry, NULL, RENAME_WHITEOUT);
Я также заблокировал с помощью rename_lock, но я пропустил, потому что это не главное. В этом случае проблема заключается в том, что все остальные структуры открытого файла после одного переименования будут возвращать ошибку «уже освобождено». Поэтому я хотел знать, существует ли способ обновить файловые дескрипторы, избегая закрытия и повторного открытия. Глядя в источник, я увидел функцию d_move d_move , поэтому я добавил эту строку, но ничего не изменилось:
d_exchange(filp_one_dentry, filp_two_dentry);
Спасибо за ваше внимание и извините за мой Engli sh
PS Я знаю, что работать с файлами таким способом не желательно