|
@@ -1582,8 +1582,23 @@ int btrfs_init_fs_root(struct btrfs_root *root)
|
|
|
ret = get_anon_bdev(&root->anon_dev);
|
|
|
if (ret)
|
|
|
goto free_writers;
|
|
|
+
|
|
|
+ mutex_lock(&root->objectid_mutex);
|
|
|
+ ret = btrfs_find_highest_objectid(root,
|
|
|
+ &root->highest_objectid);
|
|
|
+ if (ret) {
|
|
|
+ mutex_unlock(&root->objectid_mutex);
|
|
|
+ goto free_root_dev;
|
|
|
+ }
|
|
|
+
|
|
|
+ ASSERT(root->highest_objectid <= BTRFS_LAST_FREE_OBJECTID);
|
|
|
+
|
|
|
+ mutex_unlock(&root->objectid_mutex);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
+free_root_dev:
|
|
|
+ free_anon_bdev(root->anon_dev);
|
|
|
free_writers:
|
|
|
btrfs_free_subvolume_writers(root->subv_writers);
|
|
|
fail:
|
|
@@ -2901,6 +2916,18 @@ retry_root_backup:
|
|
|
tree_root->commit_root = btrfs_root_node(tree_root);
|
|
|
btrfs_set_root_refs(&tree_root->root_item, 1);
|
|
|
|
|
|
+ mutex_lock(&tree_root->objectid_mutex);
|
|
|
+ ret = btrfs_find_highest_objectid(tree_root,
|
|
|
+ &tree_root->highest_objectid);
|
|
|
+ if (ret) {
|
|
|
+ mutex_unlock(&tree_root->objectid_mutex);
|
|
|
+ goto recovery_tree_root;
|
|
|
+ }
|
|
|
+
|
|
|
+ ASSERT(tree_root->highest_objectid <= BTRFS_LAST_FREE_OBJECTID);
|
|
|
+
|
|
|
+ mutex_unlock(&tree_root->objectid_mutex);
|
|
|
+
|
|
|
ret = btrfs_read_roots(fs_info, tree_root);
|
|
|
if (ret)
|
|
|
goto recovery_tree_root;
|