2009-12-27 7 views
6

Я работаю над виртуальной файловой системой, которая не основана на дисках, вроде как/proc. Теперь я хочу создать символическую ссылку внутри нее для целевой файловой системы ext3. Я не нашел стандартной документации о способах достижения этой цели. До сих пор я догадался, что мне нужно написать функцию для ввода symlink в struct inode_operations. Но, честно говоря, я в недоумении даже с параметрами функции.Реализация символических ссылок в виртуальной файловой системе

Если это важно, я начал с этим учебником по LWN: http://lwn.net/Articles/13325/

EDIT: Я работаю с libfs, не FUSE на данный момент

+0

Я на самом деле работает на уже существующий модуль ядра, который использует libfs для создания виртуальной файловой системы. Я знаю, что было бы проще, если бы я использовал FUSE, но прямо сейчас это не может быть и речи :) – user108127

ответ

2

Я был в состоянии выполнить это, наконец. Вот что я сделал (некоторые детали могут отличаться в зависимости от того, что файловая система хочет достичь):

  1. Создать инод в линке с режимом S_IFLNK и добавить цель в i_private поле.

  2. Реализовать follow_link, потому что generic_readlink требует, чтобы присутствовать

 
static void *sample_follow_link (struct dentry *dentry, struct nameidata *nd) 
{ 
    nd->depth = 0; 
    nd_set_link(nd, (char *)dentry->d_inode->i_private); 
    return NULL; 
} 

static struct inode_operations sample_inode_ops = { 
    .readlink = generic_readlink, 
    .follow_link = sample_follow_link, 
}; 

..... 
//in the function for the dentry and inode creation 
inode->i_op = sample_inode_ops 

1

Я бы предложил взглянуть на Linux/fs/ext2/исходный код. Файлы symlink.c, inode.c, namei.c и, возможно, несколько других. Вы получите представление о том, что нужно сделать. Вопреки ожиданиям, код файловой системы отдельных файловых систем на самом деле очень короткий и легко читаемый.

Но, возможно, вместо создания новой виртуальной файловой системы вы можете задать себе другой вопрос, не будет ли сливать файловую систему уровня пользователя в моем случае? Они имеют немного лучшую документацию для создания виртуальных файловых систем и еще несколько примеров.

+0

Спасибо за предложение. Я определенно буду искать в исходном коде ext2 некоторые идеи о реализации. – user108127

3

Предположительно вы используете fuse, если вы не выполните :)

Все, что вам нужно сделать, это реализовать функцию GetAttr, чтобы сообщить ядру, что объект является символическим, а затем реализовать функцию readlink и вернуть путь, на который должна ссылаться ссылка; ядро сделает все остальное.