Из файла структуры в структуру super_block - PullRequest
0 голосов
/ 08 марта 2012

Я только что реализовал простой драйвер ( 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...