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 --- |