disk-io.c (1dae7e0e58b484eaa43d530f211098fdeeb0f404) disk-io.c (56e9357a1e8167134388d4c70654795353765c7b)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2007 Oracle. All rights reserved.
4 */
5
6#include <linux/fs.h>
7#include <linux/blkdev.h>
8#include <linux/radix-tree.h>

--- 1520 unchanged lines hidden (view full) ---

1529 btrfs_extent_buffer_leak_debug_check(fs_info);
1530 kfree(fs_info->super_copy);
1531 kfree(fs_info->super_for_commit);
1532 kvfree(fs_info);
1533}
1534
1535
1536struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2007 Oracle. All rights reserved.
4 */
5
6#include <linux/fs.h>
7#include <linux/blkdev.h>
8#include <linux/radix-tree.h>

--- 1520 unchanged lines hidden (view full) ---

1529 btrfs_extent_buffer_leak_debug_check(fs_info);
1530 kfree(fs_info->super_copy);
1531 kfree(fs_info->super_for_commit);
1532 kvfree(fs_info);
1533}
1534
1535
1536struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,
1537 struct btrfs_key *location,
1538 bool check_ref)
1537 u64 objectid, bool check_ref)
1539{
1540 struct btrfs_root *root;
1541 struct btrfs_path *path;
1542 struct btrfs_key key;
1543 int ret;
1544
1538{
1539 struct btrfs_root *root;
1540 struct btrfs_path *path;
1541 struct btrfs_key key;
1542 int ret;
1543
1545 if (location->objectid == BTRFS_ROOT_TREE_OBJECTID)
1544 if (objectid == BTRFS_ROOT_TREE_OBJECTID)
1546 return btrfs_grab_root(fs_info->tree_root);
1545 return btrfs_grab_root(fs_info->tree_root);
1547 if (location->objectid == BTRFS_EXTENT_TREE_OBJECTID)
1546 if (objectid == BTRFS_EXTENT_TREE_OBJECTID)
1548 return btrfs_grab_root(fs_info->extent_root);
1547 return btrfs_grab_root(fs_info->extent_root);
1549 if (location->objectid == BTRFS_CHUNK_TREE_OBJECTID)
1548 if (objectid == BTRFS_CHUNK_TREE_OBJECTID)
1550 return btrfs_grab_root(fs_info->chunk_root);
1549 return btrfs_grab_root(fs_info->chunk_root);
1551 if (location->objectid == BTRFS_DEV_TREE_OBJECTID)
1550 if (objectid == BTRFS_DEV_TREE_OBJECTID)
1552 return btrfs_grab_root(fs_info->dev_root);
1551 return btrfs_grab_root(fs_info->dev_root);
1553 if (location->objectid == BTRFS_CSUM_TREE_OBJECTID)
1552 if (objectid == BTRFS_CSUM_TREE_OBJECTID)
1554 return btrfs_grab_root(fs_info->csum_root);
1553 return btrfs_grab_root(fs_info->csum_root);
1555 if (location->objectid == BTRFS_QUOTA_TREE_OBJECTID)
1554 if (objectid == BTRFS_QUOTA_TREE_OBJECTID)
1556 return btrfs_grab_root(fs_info->quota_root) ?
1557 fs_info->quota_root : ERR_PTR(-ENOENT);
1555 return btrfs_grab_root(fs_info->quota_root) ?
1556 fs_info->quota_root : ERR_PTR(-ENOENT);
1558 if (location->objectid == BTRFS_UUID_TREE_OBJECTID)
1557 if (objectid == BTRFS_UUID_TREE_OBJECTID)
1559 return btrfs_grab_root(fs_info->uuid_root) ?
1560 fs_info->uuid_root : ERR_PTR(-ENOENT);
1558 return btrfs_grab_root(fs_info->uuid_root) ?
1559 fs_info->uuid_root : ERR_PTR(-ENOENT);
1561 if (location->objectid == BTRFS_FREE_SPACE_TREE_OBJECTID)
1560 if (objectid == BTRFS_FREE_SPACE_TREE_OBJECTID)
1562 return btrfs_grab_root(fs_info->free_space_root) ?
1563 fs_info->free_space_root : ERR_PTR(-ENOENT);
1564again:
1561 return btrfs_grab_root(fs_info->free_space_root) ?
1562 fs_info->free_space_root : ERR_PTR(-ENOENT);
1563again:
1565 root = btrfs_lookup_fs_root(fs_info, location->objectid);
1564 root = btrfs_lookup_fs_root(fs_info, objectid);
1566 if (root) {
1567 if (check_ref && btrfs_root_refs(&root->root_item) == 0) {
1568 btrfs_put_root(root);
1569 return ERR_PTR(-ENOENT);
1570 }
1571 return root;
1572 }
1573
1565 if (root) {
1566 if (check_ref && btrfs_root_refs(&root->root_item) == 0) {
1567 btrfs_put_root(root);
1568 return ERR_PTR(-ENOENT);
1569 }
1570 return root;
1571 }
1572
1574 root = btrfs_read_tree_root(fs_info->tree_root, location);
1573 key.objectid = objectid;
1574 key.type = BTRFS_ROOT_ITEM_KEY;
1575 key.offset = (u64)-1;
1576 root = btrfs_read_tree_root(fs_info->tree_root, &key);
1575 if (IS_ERR(root))
1576 return root;
1577
1578 if (check_ref && btrfs_root_refs(&root->root_item) == 0) {
1579 ret = -ENOENT;
1580 goto fail;
1581 }
1582
1583 ret = btrfs_init_fs_root(root);
1584 if (ret)
1585 goto fail;
1586
1587 path = btrfs_alloc_path();
1588 if (!path) {
1589 ret = -ENOMEM;
1590 goto fail;
1591 }
1592 key.objectid = BTRFS_ORPHAN_OBJECTID;
1593 key.type = BTRFS_ORPHAN_ITEM_KEY;
1577 if (IS_ERR(root))
1578 return root;
1579
1580 if (check_ref && btrfs_root_refs(&root->root_item) == 0) {
1581 ret = -ENOENT;
1582 goto fail;
1583 }
1584
1585 ret = btrfs_init_fs_root(root);
1586 if (ret)
1587 goto fail;
1588
1589 path = btrfs_alloc_path();
1590 if (!path) {
1591 ret = -ENOMEM;
1592 goto fail;
1593 }
1594 key.objectid = BTRFS_ORPHAN_OBJECTID;
1595 key.type = BTRFS_ORPHAN_ITEM_KEY;
1594 key.offset = location->objectid;
1596 key.offset = objectid;
1595
1596 ret = btrfs_search_slot(NULL, fs_info->tree_root, &key, path, 0, 0);
1597 btrfs_free_path(path);
1598 if (ret < 0)
1599 goto fail;
1600 if (ret == 0)
1601 set_bit(BTRFS_ROOT_ORPHAN_ITEM_INSERTED, &root->state);
1602

--- 685 unchanged lines hidden (view full) ---

2288 }
2289 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2290 fs_info->csum_root = root;
2291
2292 /*
2293 * This tree can share blocks with some other fs tree during relocation
2294 * and we need a proper setup by btrfs_get_fs_root
2295 */
1597
1598 ret = btrfs_search_slot(NULL, fs_info->tree_root, &key, path, 0, 0);
1599 btrfs_free_path(path);
1600 if (ret < 0)
1601 goto fail;
1602 if (ret == 0)
1603 set_bit(BTRFS_ROOT_ORPHAN_ITEM_INSERTED, &root->state);
1604

--- 685 unchanged lines hidden (view full) ---

2290 }
2291 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2292 fs_info->csum_root = root;
2293
2294 /*
2295 * This tree can share blocks with some other fs tree during relocation
2296 * and we need a proper setup by btrfs_get_fs_root
2297 */
2296 location.objectid = BTRFS_DATA_RELOC_TREE_OBJECTID;
2297 root = btrfs_get_fs_root(tree_root->fs_info, &location, true);
2298 root = btrfs_get_fs_root(tree_root->fs_info,
2299 BTRFS_DATA_RELOC_TREE_OBJECTID, true);
2298 if (IS_ERR(root)) {
2299 ret = PTR_ERR(root);
2300 goto out;
2301 }
2302 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2303 fs_info->data_reloc_root = root;
2304
2305 location.objectid = BTRFS_QUOTA_TREE_OBJECTID;

--- 528 unchanged lines hidden (view full) ---

2834 char *options)
2835{
2836 u32 sectorsize;
2837 u32 nodesize;
2838 u32 stripesize;
2839 u64 generation;
2840 u64 features;
2841 u16 csum_type;
2300 if (IS_ERR(root)) {
2301 ret = PTR_ERR(root);
2302 goto out;
2303 }
2304 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2305 fs_info->data_reloc_root = root;
2306
2307 location.objectid = BTRFS_QUOTA_TREE_OBJECTID;

--- 528 unchanged lines hidden (view full) ---

2836 char *options)
2837{
2838 u32 sectorsize;
2839 u32 nodesize;
2840 u32 stripesize;
2841 u64 generation;
2842 u64 features;
2843 u16 csum_type;
2842 struct btrfs_key location;
2843 struct btrfs_super_block *disk_super;
2844 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
2845 struct btrfs_root *tree_root;
2846 struct btrfs_root *chunk_root;
2847 int ret;
2848 int err = -EINVAL;
2849 int clear_free_space_tree = 0;
2850 int level;

--- 397 unchanged lines hidden (view full) ---

3248 if (ret < 0) {
3249 btrfs_warn(fs_info, "failed to recover relocation: %d",
3250 ret);
3251 err = -EINVAL;
3252 goto fail_qgroup;
3253 }
3254 }
3255
2844 struct btrfs_super_block *disk_super;
2845 struct btrfs_fs_info *fs_info = btrfs_sb(sb);
2846 struct btrfs_root *tree_root;
2847 struct btrfs_root *chunk_root;
2848 int ret;
2849 int err = -EINVAL;
2850 int clear_free_space_tree = 0;
2851 int level;

--- 397 unchanged lines hidden (view full) ---

3249 if (ret < 0) {
3250 btrfs_warn(fs_info, "failed to recover relocation: %d",
3251 ret);
3252 err = -EINVAL;
3253 goto fail_qgroup;
3254 }
3255 }
3256
3256 location.objectid = BTRFS_FS_TREE_OBJECTID;
3257 location.type = BTRFS_ROOT_ITEM_KEY;
3258 location.offset = 0;
3259
3260 fs_info->fs_root = btrfs_get_fs_root(fs_info, &location, true);
3257 fs_info->fs_root = btrfs_get_fs_root(fs_info, BTRFS_FS_TREE_OBJECTID, true);
3261 if (IS_ERR(fs_info->fs_root)) {
3262 err = PTR_ERR(fs_info->fs_root);
3263 btrfs_warn(fs_info, "failed to read fs tree: %d", err);
3264 fs_info->fs_root = NULL;
3265 goto fail_qgroup;
3266 }
3267
3268 if (sb_rdonly(sb))

--- 1384 unchanged lines hidden ---
3258 if (IS_ERR(fs_info->fs_root)) {
3259 err = PTR_ERR(fs_info->fs_root);
3260 btrfs_warn(fs_info, "failed to read fs tree: %d", err);
3261 fs_info->fs_root = NULL;
3262 goto fail_qgroup;
3263 }
3264
3265 if (sb_rdonly(sb))

--- 1384 unchanged lines hidden ---