Я переношу старый код ядра linux на более новую версию 2.6.32.
Есть часть, которая копирует дескриптор файла. Идея была в том, чтобы выделить новый дескриптор файла и новый struct file и использовать их с другим f_op и , оставив все остальные поля struct file эквивалентными оригинальным.
Как это сделать в современном ядре? Я написал примерную реализацию, но не знаю, следует ли мне вызывать file_get, path_get или использовать инкрементацию счетчика.
struct file * copy_file(const struct file * iOrig, int * oNewFd) {
if (!orig)
return 0;
*oNewFd = get_unused_fd();
if (*oNewFd < 0)
return 0;
struct file * rv = alloc_file(orig->f_path.mnt, orig->f_path.dentry, orig->f_path.mode, orig->f_op);
if (!rv)
goto free_fd;
fd_install(fd, rv);
return rv;
free_fd:
put_unused_fd(*oNewFd)
return 0;
}
P.S. На самом деле копирование всех файлов исходного файла не обязательно. Мне просто нужно разрешить новый набор файловых операций в пространстве пользователя. Так что создание нового дескриптора, принадлежащего current с заданным f_op, будет сделано.
path_get звучит нормально. Посмотрите пример здесь http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/fs/pipe.c#L1046, и вы сможете найти там больше ссылок, если вам нужно их.