|
|
|
@ -288,46 +288,30 @@ static int hypfs_fill_super(struct super_block *sb, void *data, int silent) |
|
|
|
|
sb->s_blocksize_bits = PAGE_CACHE_SHIFT; |
|
|
|
|
sb->s_magic = HYPFS_MAGIC; |
|
|
|
|
sb->s_op = &hypfs_s_ops; |
|
|
|
|
if (hypfs_parse_options(data, sb)) { |
|
|
|
|
rc = -EINVAL; |
|
|
|
|
goto err_alloc; |
|
|
|
|
} |
|
|
|
|
if (hypfs_parse_options(data, sb)) |
|
|
|
|
return -EINVAL; |
|
|
|
|
root_inode = hypfs_make_inode(sb, S_IFDIR | 0755); |
|
|
|
|
if (!root_inode) { |
|
|
|
|
rc = -ENOMEM; |
|
|
|
|
goto err_alloc; |
|
|
|
|
} |
|
|
|
|
if (!root_inode) |
|
|
|
|
return -ENOMEM; |
|
|
|
|
root_inode->i_op = &simple_dir_inode_operations; |
|
|
|
|
root_inode->i_fop = &simple_dir_operations; |
|
|
|
|
root_dentry = d_alloc_root(root_inode); |
|
|
|
|
sb->s_root = root_dentry = d_alloc_root(root_inode); |
|
|
|
|
if (!root_dentry) { |
|
|
|
|
iput(root_inode); |
|
|
|
|
rc = -ENOMEM; |
|
|
|
|
goto err_alloc; |
|
|
|
|
return -ENOMEM; |
|
|
|
|
} |
|
|
|
|
if (MACHINE_IS_VM) |
|
|
|
|
rc = hypfs_vm_create_files(sb, root_dentry); |
|
|
|
|
else |
|
|
|
|
rc = hypfs_diag_create_files(sb, root_dentry); |
|
|
|
|
if (rc) |
|
|
|
|
goto err_tree; |
|
|
|
|
return rc; |
|
|
|
|
sbi->update_file = hypfs_create_update_file(sb, root_dentry); |
|
|
|
|
if (IS_ERR(sbi->update_file)) { |
|
|
|
|
rc = PTR_ERR(sbi->update_file); |
|
|
|
|
goto err_tree; |
|
|
|
|
} |
|
|
|
|
if (IS_ERR(sbi->update_file)) |
|
|
|
|
return PTR_ERR(sbi->update_file); |
|
|
|
|
hypfs_update_update(sb); |
|
|
|
|
sb->s_root = root_dentry; |
|
|
|
|
pr_info("Hypervisor filesystem mounted\n"); |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
err_tree: |
|
|
|
|
hypfs_delete_tree(root_dentry); |
|
|
|
|
d_genocide(root_dentry); |
|
|
|
|
dput(root_dentry); |
|
|
|
|
err_alloc: |
|
|
|
|
kfree(sbi); |
|
|
|
|
return rc; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int hypfs_get_super(struct file_system_type *fst, int flags, |
|
|
|
@ -340,12 +324,12 @@ static void hypfs_kill_super(struct super_block *sb) |
|
|
|
|
{ |
|
|
|
|
struct hypfs_sb_info *sb_info = sb->s_fs_info; |
|
|
|
|
|
|
|
|
|
if (sb->s_root) { |
|
|
|
|
if (sb->s_root) |
|
|
|
|
hypfs_delete_tree(sb->s_root); |
|
|
|
|
if (sb_info->update_file) |
|
|
|
|
hypfs_remove(sb_info->update_file); |
|
|
|
|
kfree(sb->s_fs_info); |
|
|
|
|
sb->s_fs_info = NULL; |
|
|
|
|
} |
|
|
|
|
kfree(sb->s_fs_info); |
|
|
|
|
sb->s_fs_info = NULL; |
|
|
|
|
kill_litter_super(sb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|