Реализация символьных ссылок в виртуальной файловой системе

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

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

Править: Я работаю с libfs, не FUSE в данный момент

6
задан user108127 28 December 2009 в 23:48
поделиться

3 ответа

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

  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

2
ответ дан 17 December 2019 в 02:29
поделиться

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

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

.
1
ответ дан 17 December 2019 в 02:29
поделиться

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

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

.
3
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: