微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

挂载 VFS 错误:挂载:/fwd:错误的 fs 类型、错误的选项、/dev/loop0 上的超级块错误、缺少代码页或帮助程序或其他错误

如何解决挂载 VFS 错误:挂载:/fwd:错误的 fs 类型、错误的选项、/dev/loop0 上的超级块错误、缺少代码页或帮助程序或其他错误

我正在尝试在 Linux 中挂载 VFS,但它给了我这个错误

挂载:/fwd:错误的 fs 类型、错误的选项、/dev/loop0 上的超级块错误、缺少代码页或帮助程序或其他错误

看起来它给我的错误是我弄乱了我的超级块结构。

sudo demsg output

[25665.303994] 坏幻数

[25665.303998] 读取 buffer_head 时出错

[25665.303998] 坏块大小

我安装了 abc# mount test_###.ko /fwd 模块完整代码如下

    #include <linux/init.h>
    #include <linux/fs.h>
    #include <linux/pagemap.h>
    #include <linux/highmem.h>
    #include <linux/time.h>
    #include <linux/string.h>
    #include <linux/backing-dev.h>
    #include <linux/ramfs.h>
    #include <linux/sched.h>
    #include <linux/parser.h>
    #include <linux/magic.h>
    #include <linux/slab.h>
    #include <asm/uaccess.h>
    #include <linux/proc_fs.h>
    #include <linux/pci.h>

    #define RAMFS_DEFAULT_MODE  0755


    /*
    int pci_mmap_fits(struct pci_dev *pdev,int resno,struct vm_area_struct *vma,enum pci_mmap_api mmap_api);*/
    extern ssize_t generic_file_splice_write(struct pipe_inode_info *,struct file *,loff_t *,size_t,unsigned int);
    extern ssize_t do_sync_write(struct file *filp,const char __user *buf,size_t len,loff_t *ppos);
    const struct address_space_operations ramfs_aops = {
        .readpage   = simple_readpage,.write_begin    = simple_write_begin,.write_end  = simple_write_end,};

    const struct file_operations ramfs_file_operations = {

        .read   = generic_read_dir,.mmap       = generic_file_mmap,.fsync      = noop_fsync,.llseek     = generic_file_llseek,};

    const struct inode_operations ramfs_file_inode_operations = {
        .setattr    = simple_setattr,.getattr    = simple_getattr,};

    static const struct super_operations ramfs_ops;
    static const struct inode_operations ramfs_dir_inode_operations;

    static struct backing_dev_info ramfs_backing_dev_info = {
        .name       = "ramfs",.ra_pages   = 0,/* No readahead */
        .capabilities   = NOMMU_MAP_DIRECT | NOMMU_MAP_copY |
                      NOMMU_MAP_READ     | NOMMU_MAP_EXEC    | NOMMU_MAP_WRITE,};
    //*************************************************Functons*************************************************************

    enum pci_mmap_api {
        PCI_MMAP_SYSFS,//mmap on /sys/bus/pci/devices/<BDF>/resource<N>
        PCI_MMAP_PROCFS  //mmap on /proc/bus/pci/<BDF>
    };
    int pci_mmap_fits(struct pci_dev *pdev,struct vm_area_struct *vmai,enum pci_mmap_api mmap_api);
    struct pci_filp_private {
        enum pci_mmap_state mmap_state;
        int write_combine;
    };

    static int proc_bus_pci_mmap(struct file *file,struct vm_area_struct *vma)
    {
        struct pci_dev *dev = PDE_DATA(file_inode(file));
        struct pci_filp_private *fpriv = file->private_data;
        int i,ret;

        if (!capable(CAP_SYS_RAWIO))
        return -EPERM;

        /* Make sure the caller is mapping a real resource for this device */
        for (i = 0; i < PCI_ROM_RESOURCE; i++) {
        if (pci_mmap_fits(dev,i,vma,PCI_MMAP_PROCFS))
            break;
        }

        if (i >= PCI_ROM_RESOURCE)
        return -ENODEV;
        int bars = pci_select_bars(dev,IORESOURCE_MEM);
      /*  ret = pci_mmap_page_range(dev,bars,fpriv->mmap_state,fpriv->write_combine);
      */  if (ret < 0)
        return ret;

        return 0;
    }
    struct inode *ramfs_get_inode(struct super_block *sb,const struct inode *dir,umode_t mode,dev_t dev)
    {
        struct inode * inode = new_inode(sb);

        if (inode) {
        inode->i_ino = get_next_ino();
        inode_init_owner(inode,dir,mode);
        inode->i_mapping->a_ops = &ramfs_aops;

        mapping_set_gfp_mask(inode->i_mapping,GFP_HIGHUSER);
        mapping_set_unevictable(inode->i_mapping);
        /*inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;*/
        switch (mode & S_IFMT) {
            default:
            init_special_inode(inode,mode,dev);
            break;
            case S_IFREG:
            inode->i_op = &ramfs_file_inode_operations;
            inode->i_fop = &ramfs_file_operations;
            break;
            case S_IFDIR:
            inode->i_op = &ramfs_dir_inode_operations;
            inode->i_fop = &simple_dir_operations;

            /* directory inodes start off with i_nlink == 2 (for "." entry) */
            inc_nlink(inode);
            break;
            case S_IFLNK:
            inode->i_op = &page_symlink_inode_operations;
            break;
        }
        }
        return inode;
    }

    /*
     * File creation. Allocate an inode,and we're done..
     */
    /* SMP-safe */
    static int
    ramfs_mknod(struct inode *dir,struct dentry *dentry,dev_t dev)
    {
        struct inode * inode = ramfs_get_inode(dir->i_sb,dev);
        int error = -ENOSPC;

        if (inode) {
        d_instantiate(dentry,inode);
        dget(dentry);   /* Extra count - pin the dentry in core */
        error = 0;
        /*dir->i_mtime = dir->i_ctime = CURRENT_TIME;*/
        }
        return error;
    }

    static int ramfs_mkdir(struct inode * dir,struct dentry * dentry,umode_t mode)
    {
        int retval = ramfs_mknod(dir,dentry,mode | S_IFDIR,0);
        if (!retval)
        inc_nlink(dir);
        return retval;
    }

    static int ramfs_create(struct inode *dir,bool excl)
    {
        return ramfs_mknod(dir,mode | S_IFREG,0);
    }

    static int ramfs_symlink(struct inode * dir,const char * symname)
    {
        struct inode *inode;
        int error = -ENOSPC;

        inode = ramfs_get_inode(dir->i_sb,S_IFLNK|S_IRWXUGO,0);
        if (inode) {
        int l = strlen(symname)+1;
        error = page_symlink(inode,symname,l);
        if (!error) {
            d_instantiate(dentry,inode);
            dget(dentry);
            /*dir->i_mtime = dir->i_ctime = CURRENT_TIME;*/
        } else
            iput(inode);
        }
        return error;
    }

    static const struct inode_operations ramfs_dir_inode_operations = {
        .create     = ramfs_create,.lookup     = simple_lookup,.link       = simple_link,.unlink     = simple_unlink,.symlink    = ramfs_symlink,.mkdir      = ramfs_mkdir,.rmdir      = simple_rmdir,.mknod      = ramfs_mknod,.rename     = simple_rename,};

    static const struct super_operations ramfs_ops = {
        .statfs     = simple_statfs,.drop_inode = generic_delete_inode,};

    struct ramfs_mount_opts {
        umode_t mode;
    };

    enum {
        Opt_mode,Opt_err
    };

    static const match_table_t tokens = {
        {Opt_mode,"mode=%o"},{Opt_err,NULL}
    };

    struct ramfs_fs_info {
        struct ramfs_mount_opts mount_opts;
    };

    static int ramfs_parse_options(char *data,struct ramfs_mount_opts *opts)
    {
        substring_t args[MAX_OPT_ARGS];
        int option;
        int token;
        char *p;

        opts->mode = RAMFS_DEFAULT_MODE;

        while ((p = strsep(&data,",")) != NULL) {
        if (!*p)
            continue;

        token = match_token(p,tokens,args);
        switch (token) {
            case Opt_mode:
            if (match_octal(&args[0],&option))
                return -EINVAL;
            opts->mode = option & S_IALLUGO;
            break;
            /*
             * We might like to report bad mount options here;
             * but Traditionally ramfs has ignored all mount options,* and as it is used as a !CONfig_SHMEM simple substitute
             * for tmpfs,better continue to ignore other mount options.
             */
        }
        }

        return 0;
    }

    int ramfs_fill_super(struct super_block *sb,void *data,int silent)
    {
        struct ramfs_fs_info *fsi;
        struct inode *inode;
        int err;



        fsi = kzalloc(sizeof(struct ramfs_fs_info),GFP_KERNEL);
        sb->s_fs_info = fsi;
        if (!fsi)
        return -ENOMEM;

        err = ramfs_parse_options(data,&fsi->mount_opts);
        if (err)
        return err;

        sb->s_maxbytes      = MAX_LFS_FILESIZE;
        sb->s_blocksize     = PAGE_SIZE;
        /*sb->s_blocksize_bits    = PAGE_CACHE_SHIFT;*/
        sb->s_magic     = RAMFS_MAGIC;
        sb->s_op        = &ramfs_ops;
        sb->s_time_gran     = 1;

        inode = ramfs_get_inode(sb,NULL,S_IFDIR | fsi->mount_opts.mode,0);
        sb->s_root = d_make_root(inode);
        if (!sb->s_root)
        return -ENOMEM;

        return 0;
    }

    struct dentry *ramfs_mount(struct file_system_type *fs_type,int flags,const char *dev_name,void *data)
    {
        return mount_nodev(fs_type,flags,data,ramfs_fill_super);
    }
    #define MS_NOUSER   (1<<31)
    static struct dentry *rootfs_mount(struct file_system_type *fs_type,flags|MS_NOUSER,ramfs_fill_super);
    }

    static void ramfs_kill_sb(struct super_block *sb)
    {
        kfree(sb->s_fs_info);
        kill_litter_super(sb);
    }

    static struct file_system_type ramfs_fs_type = {
        .name       = "ramfs3",.mount      = ramfs_mount,.kill_sb    = ramfs_kill_sb,.fs_flags   = FS_USERNS_MOUNT,};


    int __init init_ramfs_fs(void)
    {
        return register_filesystem(&ramfs_fs_type);
    }

    module_init(init_ramfs_fs)

    /*
    int __init init_rootfs(void)
    {
        int err;

        err = bdi_init(&ramfs_backing_dev_info);
        if (err)
        return err;

        err = register_filesystem(&rootfs_fs_type);
        if (err)
        bdi_destroy(&ramfs_backing_dev_info);

        return err;
    }




    */

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。