diff options
Diffstat (limited to 'fs/btrfs/super.c')
-rw-r--r-- | fs/btrfs/super.c | 26 |
1 files changed, 9 insertions, 17 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 2ff7cd2db25f..e9ef8c3307fe 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -52,7 +52,6 @@ | |||
52 | #include "export.h" | 52 | #include "export.h" |
53 | #include "compression.h" | 53 | #include "compression.h" |
54 | 54 | ||
55 | |||
56 | static struct super_operations btrfs_super_ops; | 55 | static struct super_operations btrfs_super_ops; |
57 | 56 | ||
58 | static void btrfs_put_super(struct super_block *sb) | 57 | static void btrfs_put_super(struct super_block *sb) |
@@ -322,7 +321,7 @@ static int btrfs_fill_super(struct super_block *sb, | |||
322 | struct dentry *root_dentry; | 321 | struct dentry *root_dentry; |
323 | struct btrfs_super_block *disk_super; | 322 | struct btrfs_super_block *disk_super; |
324 | struct btrfs_root *tree_root; | 323 | struct btrfs_root *tree_root; |
325 | struct btrfs_inode *bi; | 324 | struct btrfs_key key; |
326 | int err; | 325 | int err; |
327 | 326 | ||
328 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 327 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
@@ -341,23 +340,15 @@ static int btrfs_fill_super(struct super_block *sb, | |||
341 | } | 340 | } |
342 | sb->s_fs_info = tree_root; | 341 | sb->s_fs_info = tree_root; |
343 | disk_super = &tree_root->fs_info->super_copy; | 342 | disk_super = &tree_root->fs_info->super_copy; |
344 | inode = btrfs_iget_locked(sb, BTRFS_FIRST_FREE_OBJECTID, | ||
345 | tree_root->fs_info->fs_root); | ||
346 | bi = BTRFS_I(inode); | ||
347 | bi->location.objectid = inode->i_ino; | ||
348 | bi->location.offset = 0; | ||
349 | bi->root = tree_root->fs_info->fs_root; | ||
350 | |||
351 | btrfs_set_key_type(&bi->location, BTRFS_INODE_ITEM_KEY); | ||
352 | 343 | ||
353 | if (!inode) { | 344 | key.objectid = BTRFS_FIRST_FREE_OBJECTID; |
354 | err = -ENOMEM; | 345 | key.type = BTRFS_INODE_ITEM_KEY; |
346 | key.offset = 0; | ||
347 | inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root); | ||
348 | if (IS_ERR(inode)) { | ||
349 | err = PTR_ERR(inode); | ||
355 | goto fail_close; | 350 | goto fail_close; |
356 | } | 351 | } |
357 | if (inode->i_state & I_NEW) { | ||
358 | btrfs_read_locked_inode(inode); | ||
359 | unlock_new_inode(inode); | ||
360 | } | ||
361 | 352 | ||
362 | root_dentry = d_alloc_root(inode); | 353 | root_dentry = d_alloc_root(inode); |
363 | if (!root_dentry) { | 354 | if (!root_dentry) { |
@@ -584,7 +575,8 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) | |||
584 | if (btrfs_super_log_root(&root->fs_info->super_copy) != 0) | 575 | if (btrfs_super_log_root(&root->fs_info->super_copy) != 0) |
585 | return -EINVAL; | 576 | return -EINVAL; |
586 | 577 | ||
587 | ret = btrfs_cleanup_reloc_trees(root); | 578 | /* recover relocation */ |
579 | ret = btrfs_recover_relocation(root); | ||
588 | WARN_ON(ret); | 580 | WARN_ON(ret); |
589 | 581 | ||
590 | ret = btrfs_cleanup_fs_roots(root->fs_info); | 582 | ret = btrfs_cleanup_fs_roots(root->fs_info); |