Я только что реализовал простой драйвер ( scull device ), следующий за драйвером устройства Linux
В функции чтения я хочу получить имя файловой системы.Поэтому я внес некоторые изменения.
ssize_t scull_read(struct file *filp, char __user *buf, size_t count,
loff_t *f_pos)
{
struct scull_dev *dev = filp->private_data;
struct scull_qset *dptr; /* the first listitem */
int quantum = dev->quantum, qset = dev->qset;
int itemsize = quantum * qset; /* how many bytes in the listitem */
int item, s_pos, q_pos, rest;
ssize_t retval = 0;
//start of change
struct super_block *sp;
const char *name;
/** Get the super_block via struct inode, it works **/
sp = flip->f_path.dentry->d_inode->i_sb;
name = sp->s_type->name;
/** Get the super_block via struct vfsmount, not works **/
sp = flip->f_path.mnt->mnt_sb;
//end of change
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
if (*f_pos >= dev->size)
goto out;
if (*f_pos + count > dev->size)
count = dev->size - *f_pos;
....
Чтобы получить super_block через inode, все работает хорошо.
Но хотя я пытаюсь получить super_block через структуру vfsmount, я получаю ошибку при компиляции
error: dereferencing pointer to incomplete type
Похоже, что super_block в структуре vfsmount не инициализируется.
Для меня мы должны получить один и тот же super_block независимо от выбранного нами метода.Но странно, что второй метод не работает.
Пожалуйста, исправьте, если я неправильно понимаю.
РЕДАКТИРОВАТЬ
Ниже приводится содержаниезаголовочный файл
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/semaphore.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include "scull.h"