示例#1
0
文件: inode.c 项目: dmgerman/original
static int devpts_remount(struct super_block * sb, int * flags, char * data)
{
	struct devpts_sb_info *sbi = sb->u.generic_sbp;
	int res = devpts_parse_options(data,sbi);
	if (res) {
		printk("devpts: called with bogus options\n");
		return -EINVAL;
	}
	return 0;
}
struct super_block *devpts_read_super(struct super_block *s, void *data,
                                      int silent)
{
    struct inode * inode;
    struct devpts_sb_info *sbi;

    sbi = (struct devpts_sb_info *) kmalloc(sizeof(struct devpts_sb_info), GFP_KERNEL);
    if ( !sbi )
        goto fail;

    sbi->magic  = DEVPTS_SBI_MAGIC;
    sbi->max_ptys = unix98_max_ptys;
    sbi->inodes = kmalloc(sizeof(struct inode *) * sbi->max_ptys, GFP_KERNEL);
    if ( !sbi->inodes )
        goto fail_free;
    memset(sbi->inodes, 0, sizeof(struct inode *) * sbi->max_ptys);

    if ( devpts_parse_options(data,sbi) && !silent) {
        printk("devpts: called with bogus options\n");
        goto fail_inode;
    }

    inode = new_inode(s);
    if (!inode)
        goto fail_inode;
    inode->i_ino = 1;
    inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
    inode->i_blocks = 0;
    inode->i_blksize = 1024;
    inode->i_uid = inode->i_gid = 0;
    inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR;
    inode->i_op = &devpts_root_inode_operations;
    inode->i_fop = &devpts_root_operations;
    inode->i_nlink = 2;

    s->u.generic_sbp = (void *) sbi;
    s->s_blocksize = 1024;
    s->s_blocksize_bits = 10;
    s->s_magic = DEVPTS_SUPER_MAGIC;
    s->s_op = &devpts_sops;
    s->s_root = d_alloc_root(inode);
    if (s->s_root)
        return s;

    printk("devpts: get root dentry failed\n");
    iput(inode);
fail_inode:
    kfree(sbi->inodes);
fail_free:
    kfree(sbi);
fail:
    return NULL;
}