diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 405 |
1 files changed, 243 insertions, 162 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 1d1017f9155..8ae72c3eedb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include "compression.h" | 52 | #include "compression.h" |
53 | #include "locking.h" | 53 | #include "locking.h" |
54 | #include "free-space-cache.h" | 54 | #include "free-space-cache.h" |
55 | #include "inode-map.h" | ||
55 | 56 | ||
56 | struct btrfs_iget_args { | 57 | struct btrfs_iget_args { |
57 | u64 ino; | 58 | u64 ino; |
@@ -139,7 +140,7 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
139 | path->leave_spinning = 1; | 140 | path->leave_spinning = 1; |
140 | btrfs_set_trans_block_group(trans, inode); | 141 | btrfs_set_trans_block_group(trans, inode); |
141 | 142 | ||
142 | key.objectid = inode->i_ino; | 143 | key.objectid = btrfs_ino(inode); |
143 | key.offset = start; | 144 | key.offset = start; |
144 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); | 145 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); |
145 | datasize = btrfs_file_extent_calc_inline_size(cur_size); | 146 | datasize = btrfs_file_extent_calc_inline_size(cur_size); |
@@ -746,6 +747,15 @@ static u64 get_extent_allocation_hint(struct inode *inode, u64 start, | |||
746 | return alloc_hint; | 747 | return alloc_hint; |
747 | } | 748 | } |
748 | 749 | ||
750 | static inline bool is_free_space_inode(struct btrfs_root *root, | ||
751 | struct inode *inode) | ||
752 | { | ||
753 | if (root == root->fs_info->tree_root || | ||
754 | BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID) | ||
755 | return true; | ||
756 | return false; | ||
757 | } | ||
758 | |||
749 | /* | 759 | /* |
750 | * when extent_io.c finds a delayed allocation range in the file, | 760 | * when extent_io.c finds a delayed allocation range in the file, |
751 | * the call backs end up in this code. The basic idea is to | 761 | * the call backs end up in this code. The basic idea is to |
@@ -778,7 +788,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
778 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 788 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
779 | int ret = 0; | 789 | int ret = 0; |
780 | 790 | ||
781 | BUG_ON(root == root->fs_info->tree_root); | 791 | BUG_ON(is_free_space_inode(root, inode)); |
782 | trans = btrfs_join_transaction(root, 1); | 792 | trans = btrfs_join_transaction(root, 1); |
783 | BUG_ON(IS_ERR(trans)); | 793 | BUG_ON(IS_ERR(trans)); |
784 | btrfs_set_trans_block_group(trans, inode); | 794 | btrfs_set_trans_block_group(trans, inode); |
@@ -1050,29 +1060,31 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1050 | int type; | 1060 | int type; |
1051 | int nocow; | 1061 | int nocow; |
1052 | int check_prev = 1; | 1062 | int check_prev = 1; |
1053 | bool nolock = false; | 1063 | bool nolock; |
1064 | u64 ino = btrfs_ino(inode); | ||
1054 | 1065 | ||
1055 | path = btrfs_alloc_path(); | 1066 | path = btrfs_alloc_path(); |
1056 | BUG_ON(!path); | 1067 | BUG_ON(!path); |
1057 | if (root == root->fs_info->tree_root) { | 1068 | |
1058 | nolock = true; | 1069 | nolock = is_free_space_inode(root, inode); |
1070 | |||
1071 | if (nolock) | ||
1059 | trans = btrfs_join_transaction_nolock(root, 1); | 1072 | trans = btrfs_join_transaction_nolock(root, 1); |
1060 | } else { | 1073 | else |
1061 | trans = btrfs_join_transaction(root, 1); | 1074 | trans = btrfs_join_transaction(root, 1); |
1062 | } | ||
1063 | BUG_ON(IS_ERR(trans)); | 1075 | BUG_ON(IS_ERR(trans)); |
1064 | 1076 | ||
1065 | cow_start = (u64)-1; | 1077 | cow_start = (u64)-1; |
1066 | cur_offset = start; | 1078 | cur_offset = start; |
1067 | while (1) { | 1079 | while (1) { |
1068 | ret = btrfs_lookup_file_extent(trans, root, path, inode->i_ino, | 1080 | ret = btrfs_lookup_file_extent(trans, root, path, ino, |
1069 | cur_offset, 0); | 1081 | cur_offset, 0); |
1070 | BUG_ON(ret < 0); | 1082 | BUG_ON(ret < 0); |
1071 | if (ret > 0 && path->slots[0] > 0 && check_prev) { | 1083 | if (ret > 0 && path->slots[0] > 0 && check_prev) { |
1072 | leaf = path->nodes[0]; | 1084 | leaf = path->nodes[0]; |
1073 | btrfs_item_key_to_cpu(leaf, &found_key, | 1085 | btrfs_item_key_to_cpu(leaf, &found_key, |
1074 | path->slots[0] - 1); | 1086 | path->slots[0] - 1); |
1075 | if (found_key.objectid == inode->i_ino && | 1087 | if (found_key.objectid == ino && |
1076 | found_key.type == BTRFS_EXTENT_DATA_KEY) | 1088 | found_key.type == BTRFS_EXTENT_DATA_KEY) |
1077 | path->slots[0]--; | 1089 | path->slots[0]--; |
1078 | } | 1090 | } |
@@ -1093,7 +1105,7 @@ next_slot: | |||
1093 | num_bytes = 0; | 1105 | num_bytes = 0; |
1094 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 1106 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
1095 | 1107 | ||
1096 | if (found_key.objectid > inode->i_ino || | 1108 | if (found_key.objectid > ino || |
1097 | found_key.type > BTRFS_EXTENT_DATA_KEY || | 1109 | found_key.type > BTRFS_EXTENT_DATA_KEY || |
1098 | found_key.offset > end) | 1110 | found_key.offset > end) |
1099 | break; | 1111 | break; |
@@ -1128,7 +1140,7 @@ next_slot: | |||
1128 | goto out_check; | 1140 | goto out_check; |
1129 | if (btrfs_extent_readonly(root, disk_bytenr)) | 1141 | if (btrfs_extent_readonly(root, disk_bytenr)) |
1130 | goto out_check; | 1142 | goto out_check; |
1131 | if (btrfs_cross_ref_exist(trans, root, inode->i_ino, | 1143 | if (btrfs_cross_ref_exist(trans, root, ino, |
1132 | found_key.offset - | 1144 | found_key.offset - |
1133 | extent_offset, disk_bytenr)) | 1145 | extent_offset, disk_bytenr)) |
1134 | goto out_check; | 1146 | goto out_check; |
@@ -1317,8 +1329,7 @@ static int btrfs_set_bit_hook(struct inode *inode, | |||
1317 | if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { | 1329 | if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { |
1318 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1330 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1319 | u64 len = state->end + 1 - state->start; | 1331 | u64 len = state->end + 1 - state->start; |
1320 | int do_list = (root->root_key.objectid != | 1332 | bool do_list = !is_free_space_inode(root, inode); |
1321 | BTRFS_ROOT_TREE_OBJECTID); | ||
1322 | 1333 | ||
1323 | if (*bits & EXTENT_FIRST_DELALLOC) | 1334 | if (*bits & EXTENT_FIRST_DELALLOC) |
1324 | *bits &= ~EXTENT_FIRST_DELALLOC; | 1335 | *bits &= ~EXTENT_FIRST_DELALLOC; |
@@ -1351,8 +1362,7 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
1351 | if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { | 1362 | if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { |
1352 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1363 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1353 | u64 len = state->end + 1 - state->start; | 1364 | u64 len = state->end + 1 - state->start; |
1354 | int do_list = (root->root_key.objectid != | 1365 | bool do_list = !is_free_space_inode(root, inode); |
1355 | BTRFS_ROOT_TREE_OBJECTID); | ||
1356 | 1366 | ||
1357 | if (*bits & EXTENT_FIRST_DELALLOC) | 1367 | if (*bits & EXTENT_FIRST_DELALLOC) |
1358 | *bits &= ~EXTENT_FIRST_DELALLOC; | 1368 | *bits &= ~EXTENT_FIRST_DELALLOC; |
@@ -1459,7 +1469,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
1459 | 1469 | ||
1460 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 1470 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
1461 | 1471 | ||
1462 | if (root == root->fs_info->tree_root) | 1472 | if (is_free_space_inode(root, inode)) |
1463 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2); | 1473 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2); |
1464 | else | 1474 | else |
1465 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | 1475 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); |
@@ -1645,7 +1655,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
1645 | &hint, 0); | 1655 | &hint, 0); |
1646 | BUG_ON(ret); | 1656 | BUG_ON(ret); |
1647 | 1657 | ||
1648 | ins.objectid = inode->i_ino; | 1658 | ins.objectid = btrfs_ino(inode); |
1649 | ins.offset = file_pos; | 1659 | ins.offset = file_pos; |
1650 | ins.type = BTRFS_EXTENT_DATA_KEY; | 1660 | ins.type = BTRFS_EXTENT_DATA_KEY; |
1651 | ret = btrfs_insert_empty_item(trans, root, path, &ins, sizeof(*fi)); | 1661 | ret = btrfs_insert_empty_item(trans, root, path, &ins, sizeof(*fi)); |
@@ -1676,7 +1686,7 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
1676 | ins.type = BTRFS_EXTENT_ITEM_KEY; | 1686 | ins.type = BTRFS_EXTENT_ITEM_KEY; |
1677 | ret = btrfs_alloc_reserved_file_extent(trans, root, | 1687 | ret = btrfs_alloc_reserved_file_extent(trans, root, |
1678 | root->root_key.objectid, | 1688 | root->root_key.objectid, |
1679 | inode->i_ino, file_pos, &ins); | 1689 | btrfs_ino(inode), file_pos, &ins); |
1680 | BUG_ON(ret); | 1690 | BUG_ON(ret); |
1681 | btrfs_free_path(path); | 1691 | btrfs_free_path(path); |
1682 | 1692 | ||
@@ -1702,7 +1712,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1702 | struct extent_state *cached_state = NULL; | 1712 | struct extent_state *cached_state = NULL; |
1703 | int compress_type = 0; | 1713 | int compress_type = 0; |
1704 | int ret; | 1714 | int ret; |
1705 | bool nolock = false; | 1715 | bool nolock; |
1706 | 1716 | ||
1707 | ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, | 1717 | ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, |
1708 | end - start + 1); | 1718 | end - start + 1); |
@@ -1710,7 +1720,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1710 | return 0; | 1720 | return 0; |
1711 | BUG_ON(!ordered_extent); | 1721 | BUG_ON(!ordered_extent); |
1712 | 1722 | ||
1713 | nolock = (root == root->fs_info->tree_root); | 1723 | nolock = is_free_space_inode(root, inode); |
1714 | 1724 | ||
1715 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { | 1725 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
1716 | BUG_ON(!list_empty(&ordered_extent->list)); | 1726 | BUG_ON(!list_empty(&ordered_extent->list)); |
@@ -2005,8 +2015,9 @@ good: | |||
2005 | return 0; | 2015 | return 0; |
2006 | 2016 | ||
2007 | zeroit: | 2017 | zeroit: |
2008 | printk_ratelimited(KERN_INFO "btrfs csum failed ino %lu off %llu csum %u " | 2018 | printk_ratelimited(KERN_INFO "btrfs csum failed ino %llu off %llu csum %u " |
2009 | "private %llu\n", page->mapping->host->i_ino, | 2019 | "private %llu\n", |
2020 | (unsigned long long)btrfs_ino(page->mapping->host), | ||
2010 | (unsigned long long)start, csum, | 2021 | (unsigned long long)start, csum, |
2011 | (unsigned long long)private); | 2022 | (unsigned long long)private); |
2012 | memset(kaddr + offset, 1, end - start + 1); | 2023 | memset(kaddr + offset, 1, end - start + 1); |
@@ -2243,7 +2254,7 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2243 | 2254 | ||
2244 | /* insert an orphan item to track this unlinked/truncated file */ | 2255 | /* insert an orphan item to track this unlinked/truncated file */ |
2245 | if (insert >= 1) { | 2256 | if (insert >= 1) { |
2246 | ret = btrfs_insert_orphan_item(trans, root, inode->i_ino); | 2257 | ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode)); |
2247 | BUG_ON(ret); | 2258 | BUG_ON(ret); |
2248 | } | 2259 | } |
2249 | 2260 | ||
@@ -2280,7 +2291,7 @@ int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode) | |||
2280 | spin_unlock(&root->orphan_lock); | 2291 | spin_unlock(&root->orphan_lock); |
2281 | 2292 | ||
2282 | if (trans && delete_item) { | 2293 | if (trans && delete_item) { |
2283 | ret = btrfs_del_orphan_item(trans, root, inode->i_ino); | 2294 | ret = btrfs_del_orphan_item(trans, root, btrfs_ino(inode)); |
2284 | BUG_ON(ret); | 2295 | BUG_ON(ret); |
2285 | } | 2296 | } |
2286 | 2297 | ||
@@ -2542,7 +2553,8 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
2542 | * try to precache a NULL acl entry for files that don't have | 2553 | * try to precache a NULL acl entry for files that don't have |
2543 | * any xattrs or acls | 2554 | * any xattrs or acls |
2544 | */ | 2555 | */ |
2545 | maybe_acls = acls_after_inode_item(leaf, path->slots[0], inode->i_ino); | 2556 | maybe_acls = acls_after_inode_item(leaf, path->slots[0], |
2557 | btrfs_ino(inode)); | ||
2546 | if (!maybe_acls) | 2558 | if (!maybe_acls) |
2547 | cache_no_acl(inode); | 2559 | cache_no_acl(inode); |
2548 | 2560 | ||
@@ -2646,11 +2658,26 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans, | |||
2646 | struct extent_buffer *leaf; | 2658 | struct extent_buffer *leaf; |
2647 | int ret; | 2659 | int ret; |
2648 | 2660 | ||
2661 | /* | ||
2662 | * If root is tree root, it means this inode is used to | ||
2663 | * store free space information. And these inodes are updated | ||
2664 | * when committing the transaction, so they needn't delaye to | ||
2665 | * be updated, or deadlock will occured. | ||
2666 | */ | ||
2667 | if (!is_free_space_inode(root, inode)) { | ||
2668 | ret = btrfs_delayed_update_inode(trans, root, inode); | ||
2669 | if (!ret) | ||
2670 | btrfs_set_inode_last_trans(trans, inode); | ||
2671 | return ret; | ||
2672 | } | ||
2673 | |||
2649 | path = btrfs_alloc_path(); | 2674 | path = btrfs_alloc_path(); |
2650 | BUG_ON(!path); | 2675 | if (!path) |
2676 | return -ENOMEM; | ||
2677 | |||
2651 | path->leave_spinning = 1; | 2678 | path->leave_spinning = 1; |
2652 | ret = btrfs_lookup_inode(trans, root, path, | 2679 | ret = btrfs_lookup_inode(trans, root, path, &BTRFS_I(inode)->location, |
2653 | &BTRFS_I(inode)->location, 1); | 2680 | 1); |
2654 | if (ret) { | 2681 | if (ret) { |
2655 | if (ret > 0) | 2682 | if (ret > 0) |
2656 | ret = -ENOENT; | 2683 | ret = -ENOENT; |
@@ -2660,7 +2687,7 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans, | |||
2660 | btrfs_unlock_up_safe(path, 1); | 2687 | btrfs_unlock_up_safe(path, 1); |
2661 | leaf = path->nodes[0]; | 2688 | leaf = path->nodes[0]; |
2662 | inode_item = btrfs_item_ptr(leaf, path->slots[0], | 2689 | inode_item = btrfs_item_ptr(leaf, path->slots[0], |
2663 | struct btrfs_inode_item); | 2690 | struct btrfs_inode_item); |
2664 | 2691 | ||
2665 | fill_inode_item(trans, leaf, inode_item, inode); | 2692 | fill_inode_item(trans, leaf, inode_item, inode); |
2666 | btrfs_mark_buffer_dirty(leaf); | 2693 | btrfs_mark_buffer_dirty(leaf); |
@@ -2671,7 +2698,6 @@ failed: | |||
2671 | return ret; | 2698 | return ret; |
2672 | } | 2699 | } |
2673 | 2700 | ||
2674 | |||
2675 | /* | 2701 | /* |
2676 | * unlink helper that gets used here in inode.c and in the tree logging | 2702 | * unlink helper that gets used here in inode.c and in the tree logging |
2677 | * recovery code. It remove a link in a directory with a given name, and | 2703 | * recovery code. It remove a link in a directory with a given name, and |
@@ -2688,6 +2714,8 @@ static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2688 | struct btrfs_dir_item *di; | 2714 | struct btrfs_dir_item *di; |
2689 | struct btrfs_key key; | 2715 | struct btrfs_key key; |
2690 | u64 index; | 2716 | u64 index; |
2717 | u64 ino = btrfs_ino(inode); | ||
2718 | u64 dir_ino = btrfs_ino(dir); | ||
2691 | 2719 | ||
2692 | path = btrfs_alloc_path(); | 2720 | path = btrfs_alloc_path(); |
2693 | if (!path) { | 2721 | if (!path) { |
@@ -2696,7 +2724,7 @@ static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2696 | } | 2724 | } |
2697 | 2725 | ||
2698 | path->leave_spinning = 1; | 2726 | path->leave_spinning = 1; |
2699 | di = btrfs_lookup_dir_item(trans, root, path, dir->i_ino, | 2727 | di = btrfs_lookup_dir_item(trans, root, path, dir_ino, |
2700 | name, name_len, -1); | 2728 | name, name_len, -1); |
2701 | if (IS_ERR(di)) { | 2729 | if (IS_ERR(di)) { |
2702 | ret = PTR_ERR(di); | 2730 | ret = PTR_ERR(di); |
@@ -2713,31 +2741,21 @@ static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2713 | goto err; | 2741 | goto err; |
2714 | btrfs_release_path(path); | 2742 | btrfs_release_path(path); |
2715 | 2743 | ||
2716 | ret = btrfs_del_inode_ref(trans, root, name, name_len, | 2744 | ret = btrfs_del_inode_ref(trans, root, name, name_len, ino, |
2717 | inode->i_ino, | 2745 | dir_ino, &index); |
2718 | dir->i_ino, &index); | ||
2719 | if (ret) { | 2746 | if (ret) { |
2720 | printk(KERN_INFO "btrfs failed to delete reference to %.*s, " | 2747 | printk(KERN_INFO "btrfs failed to delete reference to %.*s, " |
2721 | "inode %lu parent %lu\n", name_len, name, | 2748 | "inode %llu parent %llu\n", name_len, name, |
2722 | inode->i_ino, dir->i_ino); | 2749 | (unsigned long long)ino, (unsigned long long)dir_ino); |
2723 | goto err; | 2750 | goto err; |
2724 | } | 2751 | } |
2725 | 2752 | ||
2726 | di = btrfs_lookup_dir_index_item(trans, root, path, dir->i_ino, | 2753 | ret = btrfs_delete_delayed_dir_index(trans, root, dir, index); |
2727 | index, name, name_len, -1); | 2754 | if (ret) |
2728 | if (IS_ERR(di)) { | ||
2729 | ret = PTR_ERR(di); | ||
2730 | goto err; | ||
2731 | } | ||
2732 | if (!di) { | ||
2733 | ret = -ENOENT; | ||
2734 | goto err; | 2755 | goto err; |
2735 | } | ||
2736 | ret = btrfs_delete_one_dir_name(trans, root, path, di); | ||
2737 | btrfs_release_path(path); | ||
2738 | 2756 | ||
2739 | ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len, | 2757 | ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len, |
2740 | inode, dir->i_ino); | 2758 | inode, dir_ino); |
2741 | BUG_ON(ret != 0 && ret != -ENOENT); | 2759 | BUG_ON(ret != 0 && ret != -ENOENT); |
2742 | 2760 | ||
2743 | ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, | 2761 | ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, |
@@ -2815,12 +2833,14 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2815 | int check_link = 1; | 2833 | int check_link = 1; |
2816 | int err = -ENOSPC; | 2834 | int err = -ENOSPC; |
2817 | int ret; | 2835 | int ret; |
2836 | u64 ino = btrfs_ino(inode); | ||
2837 | u64 dir_ino = btrfs_ino(dir); | ||
2818 | 2838 | ||
2819 | trans = btrfs_start_transaction(root, 10); | 2839 | trans = btrfs_start_transaction(root, 10); |
2820 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) | 2840 | if (!IS_ERR(trans) || PTR_ERR(trans) != -ENOSPC) |
2821 | return trans; | 2841 | return trans; |
2822 | 2842 | ||
2823 | if (inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) | 2843 | if (ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) |
2824 | return ERR_PTR(-ENOSPC); | 2844 | return ERR_PTR(-ENOSPC); |
2825 | 2845 | ||
2826 | /* check if there is someone else holds reference */ | 2846 | /* check if there is someone else holds reference */ |
@@ -2879,7 +2899,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2879 | 2899 | ||
2880 | if (ret == 0 && S_ISREG(inode->i_mode)) { | 2900 | if (ret == 0 && S_ISREG(inode->i_mode)) { |
2881 | ret = btrfs_lookup_file_extent(trans, root, path, | 2901 | ret = btrfs_lookup_file_extent(trans, root, path, |
2882 | inode->i_ino, (u64)-1, 0); | 2902 | ino, (u64)-1, 0); |
2883 | if (ret < 0) { | 2903 | if (ret < 0) { |
2884 | err = ret; | 2904 | err = ret; |
2885 | goto out; | 2905 | goto out; |
@@ -2895,7 +2915,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2895 | goto out; | 2915 | goto out; |
2896 | } | 2916 | } |
2897 | 2917 | ||
2898 | di = btrfs_lookup_dir_item(trans, root, path, dir->i_ino, | 2918 | di = btrfs_lookup_dir_item(trans, root, path, dir_ino, |
2899 | dentry->d_name.name, dentry->d_name.len, 0); | 2919 | dentry->d_name.name, dentry->d_name.len, 0); |
2900 | if (IS_ERR(di)) { | 2920 | if (IS_ERR(di)) { |
2901 | err = PTR_ERR(di); | 2921 | err = PTR_ERR(di); |
@@ -2912,7 +2932,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2912 | 2932 | ||
2913 | ref = btrfs_lookup_inode_ref(trans, root, path, | 2933 | ref = btrfs_lookup_inode_ref(trans, root, path, |
2914 | dentry->d_name.name, dentry->d_name.len, | 2934 | dentry->d_name.name, dentry->d_name.len, |
2915 | inode->i_ino, dir->i_ino, 0); | 2935 | ino, dir_ino, 0); |
2916 | if (IS_ERR(ref)) { | 2936 | if (IS_ERR(ref)) { |
2917 | err = PTR_ERR(ref); | 2937 | err = PTR_ERR(ref); |
2918 | goto out; | 2938 | goto out; |
@@ -2923,7 +2943,15 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir, | |||
2923 | index = btrfs_inode_ref_index(path->nodes[0], ref); | 2943 | index = btrfs_inode_ref_index(path->nodes[0], ref); |
2924 | btrfs_release_path(path); | 2944 | btrfs_release_path(path); |
2925 | 2945 | ||
2926 | di = btrfs_lookup_dir_index_item(trans, root, path, dir->i_ino, index, | 2946 | /* |
2947 | * This is a commit root search, if we can lookup inode item and other | ||
2948 | * relative items in the commit root, it means the transaction of | ||
2949 | * dir/file creation has been committed, and the dir index item that we | ||
2950 | * delay to insert has also been inserted into the commit root. So | ||
2951 | * we needn't worry about the delayed insertion of the dir index item | ||
2952 | * here. | ||
2953 | */ | ||
2954 | di = btrfs_lookup_dir_index_item(trans, root, path, dir_ino, index, | ||
2927 | dentry->d_name.name, dentry->d_name.len, 0); | 2955 | dentry->d_name.name, dentry->d_name.len, 0); |
2928 | if (IS_ERR(di)) { | 2956 | if (IS_ERR(di)) { |
2929 | err = PTR_ERR(di); | 2957 | err = PTR_ERR(di); |
@@ -2998,12 +3026,13 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, | |||
2998 | struct btrfs_key key; | 3026 | struct btrfs_key key; |
2999 | u64 index; | 3027 | u64 index; |
3000 | int ret; | 3028 | int ret; |
3029 | u64 dir_ino = btrfs_ino(dir); | ||
3001 | 3030 | ||
3002 | path = btrfs_alloc_path(); | 3031 | path = btrfs_alloc_path(); |
3003 | if (!path) | 3032 | if (!path) |
3004 | return -ENOMEM; | 3033 | return -ENOMEM; |
3005 | 3034 | ||
3006 | di = btrfs_lookup_dir_item(trans, root, path, dir->i_ino, | 3035 | di = btrfs_lookup_dir_item(trans, root, path, dir_ino, |
3007 | name, name_len, -1); | 3036 | name, name_len, -1); |
3008 | BUG_ON(IS_ERR_OR_NULL(di)); | 3037 | BUG_ON(IS_ERR_OR_NULL(di)); |
3009 | 3038 | ||
@@ -3016,10 +3045,10 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, | |||
3016 | 3045 | ||
3017 | ret = btrfs_del_root_ref(trans, root->fs_info->tree_root, | 3046 | ret = btrfs_del_root_ref(trans, root->fs_info->tree_root, |
3018 | objectid, root->root_key.objectid, | 3047 | objectid, root->root_key.objectid, |
3019 | dir->i_ino, &index, name, name_len); | 3048 | dir_ino, &index, name, name_len); |
3020 | if (ret < 0) { | 3049 | if (ret < 0) { |
3021 | BUG_ON(ret != -ENOENT); | 3050 | BUG_ON(ret != -ENOENT); |
3022 | di = btrfs_search_dir_index_item(root, path, dir->i_ino, | 3051 | di = btrfs_search_dir_index_item(root, path, dir_ino, |
3023 | name, name_len); | 3052 | name, name_len); |
3024 | BUG_ON(IS_ERR_OR_NULL(di)); | 3053 | BUG_ON(IS_ERR_OR_NULL(di)); |
3025 | 3054 | ||
@@ -3028,24 +3057,16 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, | |||
3028 | btrfs_release_path(path); | 3057 | btrfs_release_path(path); |
3029 | index = key.offset; | 3058 | index = key.offset; |
3030 | } | 3059 | } |
3060 | btrfs_release_path(path); | ||
3031 | 3061 | ||
3032 | di = btrfs_lookup_dir_index_item(trans, root, path, dir->i_ino, | 3062 | ret = btrfs_delete_delayed_dir_index(trans, root, dir, index); |
3033 | index, name, name_len, -1); | ||
3034 | BUG_ON(IS_ERR_OR_NULL(di)); | ||
3035 | |||
3036 | leaf = path->nodes[0]; | ||
3037 | btrfs_dir_item_key_to_cpu(leaf, di, &key); | ||
3038 | WARN_ON(key.type != BTRFS_ROOT_ITEM_KEY || key.objectid != objectid); | ||
3039 | ret = btrfs_delete_one_dir_name(trans, root, path, di); | ||
3040 | BUG_ON(ret); | 3063 | BUG_ON(ret); |
3041 | btrfs_release_path(path); | ||
3042 | 3064 | ||
3043 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 3065 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
3044 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 3066 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
3045 | ret = btrfs_update_inode(trans, root, dir); | 3067 | ret = btrfs_update_inode(trans, root, dir); |
3046 | BUG_ON(ret); | 3068 | BUG_ON(ret); |
3047 | 3069 | ||
3048 | btrfs_free_path(path); | ||
3049 | return 0; | 3070 | return 0; |
3050 | } | 3071 | } |
3051 | 3072 | ||
@@ -3058,7 +3079,7 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
3058 | unsigned long nr = 0; | 3079 | unsigned long nr = 0; |
3059 | 3080 | ||
3060 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE || | 3081 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE || |
3061 | inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 3082 | btrfs_ino(inode) == BTRFS_FIRST_FREE_OBJECTID) |
3062 | return -ENOTEMPTY; | 3083 | return -ENOTEMPTY; |
3063 | 3084 | ||
3064 | trans = __unlink_start_trans(dir, dentry); | 3085 | trans = __unlink_start_trans(dir, dentry); |
@@ -3067,7 +3088,7 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
3067 | 3088 | ||
3068 | btrfs_set_trans_block_group(trans, dir); | 3089 | btrfs_set_trans_block_group(trans, dir); |
3069 | 3090 | ||
3070 | if (unlikely(inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { | 3091 | if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { |
3071 | err = btrfs_unlink_subvol(trans, root, dir, | 3092 | err = btrfs_unlink_subvol(trans, root, dir, |
3072 | BTRFS_I(inode)->location.objectid, | 3093 | BTRFS_I(inode)->location.objectid, |
3073 | dentry->d_name.name, | 3094 | dentry->d_name.name, |
@@ -3127,17 +3148,27 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | |||
3127 | int encoding; | 3148 | int encoding; |
3128 | int ret; | 3149 | int ret; |
3129 | int err = 0; | 3150 | int err = 0; |
3151 | u64 ino = btrfs_ino(inode); | ||
3130 | 3152 | ||
3131 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); | 3153 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); |
3132 | 3154 | ||
3133 | if (root->ref_cows || root == root->fs_info->tree_root) | 3155 | if (root->ref_cows || root == root->fs_info->tree_root) |
3134 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); | 3156 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); |
3135 | 3157 | ||
3158 | /* | ||
3159 | * This function is also used to drop the items in the log tree before | ||
3160 | * we relog the inode, so if root != BTRFS_I(inode)->root, it means | ||
3161 | * it is used to drop the loged items. So we shouldn't kill the delayed | ||
3162 | * items. | ||
3163 | */ | ||
3164 | if (min_type == 0 && root == BTRFS_I(inode)->root) | ||
3165 | btrfs_kill_delayed_inode_items(inode); | ||
3166 | |||
3136 | path = btrfs_alloc_path(); | 3167 | path = btrfs_alloc_path(); |
3137 | BUG_ON(!path); | 3168 | BUG_ON(!path); |
3138 | path->reada = -1; | 3169 | path->reada = -1; |
3139 | 3170 | ||
3140 | key.objectid = inode->i_ino; | 3171 | key.objectid = ino; |
3141 | key.offset = (u64)-1; | 3172 | key.offset = (u64)-1; |
3142 | key.type = (u8)-1; | 3173 | key.type = (u8)-1; |
3143 | 3174 | ||
@@ -3165,7 +3196,7 @@ search_again: | |||
3165 | found_type = btrfs_key_type(&found_key); | 3196 | found_type = btrfs_key_type(&found_key); |
3166 | encoding = 0; | 3197 | encoding = 0; |
3167 | 3198 | ||
3168 | if (found_key.objectid != inode->i_ino) | 3199 | if (found_key.objectid != ino) |
3169 | break; | 3200 | break; |
3170 | 3201 | ||
3171 | if (found_type < min_type) | 3202 | if (found_type < min_type) |
@@ -3284,7 +3315,7 @@ delete: | |||
3284 | ret = btrfs_free_extent(trans, root, extent_start, | 3315 | ret = btrfs_free_extent(trans, root, extent_start, |
3285 | extent_num_bytes, 0, | 3316 | extent_num_bytes, 0, |
3286 | btrfs_header_owner(leaf), | 3317 | btrfs_header_owner(leaf), |
3287 | inode->i_ino, extent_offset); | 3318 | ino, extent_offset); |
3288 | BUG_ON(ret); | 3319 | BUG_ON(ret); |
3289 | } | 3320 | } |
3290 | 3321 | ||
@@ -3293,7 +3324,9 @@ delete: | |||
3293 | 3324 | ||
3294 | if (path->slots[0] == 0 || | 3325 | if (path->slots[0] == 0 || |
3295 | path->slots[0] != pending_del_slot) { | 3326 | path->slots[0] != pending_del_slot) { |
3296 | if (root->ref_cows) { | 3327 | if (root->ref_cows && |
3328 | BTRFS_I(inode)->location.objectid != | ||
3329 | BTRFS_FREE_INO_OBJECTID) { | ||
3297 | err = -EAGAIN; | 3330 | err = -EAGAIN; |
3298 | goto out; | 3331 | goto out; |
3299 | } | 3332 | } |
@@ -3483,7 +3516,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
3483 | break; | 3516 | break; |
3484 | 3517 | ||
3485 | err = btrfs_insert_file_extent(trans, root, | 3518 | err = btrfs_insert_file_extent(trans, root, |
3486 | inode->i_ino, cur_offset, 0, | 3519 | btrfs_ino(inode), cur_offset, 0, |
3487 | 0, hole_size, 0, hole_size, | 3520 | 0, hole_size, 0, hole_size, |
3488 | 0, 0, 0); | 3521 | 0, 0, 0); |
3489 | if (err) | 3522 | if (err) |
@@ -3585,7 +3618,7 @@ void btrfs_evict_inode(struct inode *inode) | |||
3585 | 3618 | ||
3586 | truncate_inode_pages(&inode->i_data, 0); | 3619 | truncate_inode_pages(&inode->i_data, 0); |
3587 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || | 3620 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || |
3588 | root == root->fs_info->tree_root)) | 3621 | is_free_space_inode(root, inode))) |
3589 | goto no_delete; | 3622 | goto no_delete; |
3590 | 3623 | ||
3591 | if (is_bad_inode(inode)) { | 3624 | if (is_bad_inode(inode)) { |
@@ -3638,6 +3671,10 @@ void btrfs_evict_inode(struct inode *inode) | |||
3638 | BUG_ON(ret); | 3671 | BUG_ON(ret); |
3639 | } | 3672 | } |
3640 | 3673 | ||
3674 | if (!(root == root->fs_info->tree_root || | ||
3675 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) | ||
3676 | btrfs_return_ino(root, btrfs_ino(inode)); | ||
3677 | |||
3641 | nr = trans->blocks_used; | 3678 | nr = trans->blocks_used; |
3642 | btrfs_end_transaction(trans, root); | 3679 | btrfs_end_transaction(trans, root); |
3643 | btrfs_btree_balance_dirty(root, nr); | 3680 | btrfs_btree_balance_dirty(root, nr); |
@@ -3663,7 +3700,7 @@ static int btrfs_inode_by_name(struct inode *dir, struct dentry *dentry, | |||
3663 | path = btrfs_alloc_path(); | 3700 | path = btrfs_alloc_path(); |
3664 | BUG_ON(!path); | 3701 | BUG_ON(!path); |
3665 | 3702 | ||
3666 | di = btrfs_lookup_dir_item(NULL, root, path, dir->i_ino, name, | 3703 | di = btrfs_lookup_dir_item(NULL, root, path, btrfs_ino(dir), name, |
3667 | namelen, 0); | 3704 | namelen, 0); |
3668 | if (IS_ERR(di)) | 3705 | if (IS_ERR(di)) |
3669 | ret = PTR_ERR(di); | 3706 | ret = PTR_ERR(di); |
@@ -3716,7 +3753,7 @@ static int fixup_tree_root_location(struct btrfs_root *root, | |||
3716 | 3753 | ||
3717 | leaf = path->nodes[0]; | 3754 | leaf = path->nodes[0]; |
3718 | ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref); | 3755 | ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref); |
3719 | if (btrfs_root_ref_dirid(leaf, ref) != dir->i_ino || | 3756 | if (btrfs_root_ref_dirid(leaf, ref) != btrfs_ino(dir) || |
3720 | btrfs_root_ref_name_len(leaf, ref) != dentry->d_name.len) | 3757 | btrfs_root_ref_name_len(leaf, ref) != dentry->d_name.len) |
3721 | goto out; | 3758 | goto out; |
3722 | 3759 | ||
@@ -3755,6 +3792,7 @@ static void inode_tree_add(struct inode *inode) | |||
3755 | struct btrfs_inode *entry; | 3792 | struct btrfs_inode *entry; |
3756 | struct rb_node **p; | 3793 | struct rb_node **p; |
3757 | struct rb_node *parent; | 3794 | struct rb_node *parent; |
3795 | u64 ino = btrfs_ino(inode); | ||
3758 | again: | 3796 | again: |
3759 | p = &root->inode_tree.rb_node; | 3797 | p = &root->inode_tree.rb_node; |
3760 | parent = NULL; | 3798 | parent = NULL; |
@@ -3767,9 +3805,9 @@ again: | |||
3767 | parent = *p; | 3805 | parent = *p; |
3768 | entry = rb_entry(parent, struct btrfs_inode, rb_node); | 3806 | entry = rb_entry(parent, struct btrfs_inode, rb_node); |
3769 | 3807 | ||
3770 | if (inode->i_ino < entry->vfs_inode.i_ino) | 3808 | if (ino < btrfs_ino(&entry->vfs_inode)) |
3771 | p = &parent->rb_left; | 3809 | p = &parent->rb_left; |
3772 | else if (inode->i_ino > entry->vfs_inode.i_ino) | 3810 | else if (ino > btrfs_ino(&entry->vfs_inode)) |
3773 | p = &parent->rb_right; | 3811 | p = &parent->rb_right; |
3774 | else { | 3812 | else { |
3775 | WARN_ON(!(entry->vfs_inode.i_state & | 3813 | WARN_ON(!(entry->vfs_inode.i_state & |
@@ -3833,9 +3871,9 @@ again: | |||
3833 | prev = node; | 3871 | prev = node; |
3834 | entry = rb_entry(node, struct btrfs_inode, rb_node); | 3872 | entry = rb_entry(node, struct btrfs_inode, rb_node); |
3835 | 3873 | ||
3836 | if (objectid < entry->vfs_inode.i_ino) | 3874 | if (objectid < btrfs_ino(&entry->vfs_inode)) |
3837 | node = node->rb_left; | 3875 | node = node->rb_left; |
3838 | else if (objectid > entry->vfs_inode.i_ino) | 3876 | else if (objectid > btrfs_ino(&entry->vfs_inode)) |
3839 | node = node->rb_right; | 3877 | node = node->rb_right; |
3840 | else | 3878 | else |
3841 | break; | 3879 | break; |
@@ -3843,7 +3881,7 @@ again: | |||
3843 | if (!node) { | 3881 | if (!node) { |
3844 | while (prev) { | 3882 | while (prev) { |
3845 | entry = rb_entry(prev, struct btrfs_inode, rb_node); | 3883 | entry = rb_entry(prev, struct btrfs_inode, rb_node); |
3846 | if (objectid <= entry->vfs_inode.i_ino) { | 3884 | if (objectid <= btrfs_ino(&entry->vfs_inode)) { |
3847 | node = prev; | 3885 | node = prev; |
3848 | break; | 3886 | break; |
3849 | } | 3887 | } |
@@ -3852,7 +3890,7 @@ again: | |||
3852 | } | 3890 | } |
3853 | while (node) { | 3891 | while (node) { |
3854 | entry = rb_entry(node, struct btrfs_inode, rb_node); | 3892 | entry = rb_entry(node, struct btrfs_inode, rb_node); |
3855 | objectid = entry->vfs_inode.i_ino + 1; | 3893 | objectid = btrfs_ino(&entry->vfs_inode) + 1; |
3856 | inode = igrab(&entry->vfs_inode); | 3894 | inode = igrab(&entry->vfs_inode); |
3857 | if (inode) { | 3895 | if (inode) { |
3858 | spin_unlock(&root->inode_lock); | 3896 | spin_unlock(&root->inode_lock); |
@@ -3890,7 +3928,7 @@ static int btrfs_init_locked_inode(struct inode *inode, void *p) | |||
3890 | static int btrfs_find_actor(struct inode *inode, void *opaque) | 3928 | static int btrfs_find_actor(struct inode *inode, void *opaque) |
3891 | { | 3929 | { |
3892 | struct btrfs_iget_args *args = opaque; | 3930 | struct btrfs_iget_args *args = opaque; |
3893 | return args->ino == inode->i_ino && | 3931 | return args->ino == btrfs_ino(inode) && |
3894 | args->root == BTRFS_I(inode)->root; | 3932 | args->root == BTRFS_I(inode)->root; |
3895 | } | 3933 | } |
3896 | 3934 | ||
@@ -4035,7 +4073,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, | |||
4035 | return d_splice_alias(inode, dentry); | 4073 | return d_splice_alias(inode, dentry); |
4036 | } | 4074 | } |
4037 | 4075 | ||
4038 | static unsigned char btrfs_filetype_table[] = { | 4076 | unsigned char btrfs_filetype_table[] = { |
4039 | DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK | 4077 | DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK |
4040 | }; | 4078 | }; |
4041 | 4079 | ||
@@ -4049,6 +4087,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4049 | struct btrfs_key key; | 4087 | struct btrfs_key key; |
4050 | struct btrfs_key found_key; | 4088 | struct btrfs_key found_key; |
4051 | struct btrfs_path *path; | 4089 | struct btrfs_path *path; |
4090 | struct list_head ins_list; | ||
4091 | struct list_head del_list; | ||
4052 | int ret; | 4092 | int ret; |
4053 | struct extent_buffer *leaf; | 4093 | struct extent_buffer *leaf; |
4054 | int slot; | 4094 | int slot; |
@@ -4061,6 +4101,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4061 | char tmp_name[32]; | 4101 | char tmp_name[32]; |
4062 | char *name_ptr; | 4102 | char *name_ptr; |
4063 | int name_len; | 4103 | int name_len; |
4104 | int is_curr = 0; /* filp->f_pos points to the current index? */ | ||
4064 | 4105 | ||
4065 | /* FIXME, use a real flag for deciding about the key type */ | 4106 | /* FIXME, use a real flag for deciding about the key type */ |
4066 | if (root->fs_info->tree_root == root) | 4107 | if (root->fs_info->tree_root == root) |
@@ -4068,9 +4109,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4068 | 4109 | ||
4069 | /* special case for "." */ | 4110 | /* special case for "." */ |
4070 | if (filp->f_pos == 0) { | 4111 | if (filp->f_pos == 0) { |
4071 | over = filldir(dirent, ".", 1, | 4112 | over = filldir(dirent, ".", 1, 1, btrfs_ino(inode), DT_DIR); |
4072 | 1, inode->i_ino, | ||
4073 | DT_DIR); | ||
4074 | if (over) | 4113 | if (over) |
4075 | return 0; | 4114 | return 0; |
4076 | filp->f_pos = 1; | 4115 | filp->f_pos = 1; |
@@ -4085,11 +4124,19 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4085 | filp->f_pos = 2; | 4124 | filp->f_pos = 2; |
4086 | } | 4125 | } |
4087 | path = btrfs_alloc_path(); | 4126 | path = btrfs_alloc_path(); |
4127 | if (!path) | ||
4128 | return -ENOMEM; | ||
4088 | path->reada = 2; | 4129 | path->reada = 2; |
4089 | 4130 | ||
4131 | if (key_type == BTRFS_DIR_INDEX_KEY) { | ||
4132 | INIT_LIST_HEAD(&ins_list); | ||
4133 | INIT_LIST_HEAD(&del_list); | ||
4134 | btrfs_get_delayed_items(inode, &ins_list, &del_list); | ||
4135 | } | ||
4136 | |||
4090 | btrfs_set_key_type(&key, key_type); | 4137 | btrfs_set_key_type(&key, key_type); |
4091 | key.offset = filp->f_pos; | 4138 | key.offset = filp->f_pos; |
4092 | key.objectid = inode->i_ino; | 4139 | key.objectid = btrfs_ino(inode); |
4093 | 4140 | ||
4094 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 4141 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
4095 | if (ret < 0) | 4142 | if (ret < 0) |
@@ -4116,8 +4163,13 @@ static int btrfs_real_readdir(struct file *filp, void *dirent, | |||
4116 | break; | 4163 | break; |
4117 | if (found_key.offset < filp->f_pos) | 4164 | if (found_key.offset < filp->f_pos) |
4118 | goto next; | 4165 | goto next; |
4166 | if (key_type == BTRFS_DIR_INDEX_KEY && | ||
4167 | btrfs_should_delete_dir_index(&del_list, | ||
4168 | found_key.offset)) | ||
4169 | goto next; | ||
4119 | 4170 | ||
4120 | filp->f_pos = found_key.offset; | 4171 | filp->f_pos = found_key.offset; |
4172 | is_curr = 1; | ||
4121 | 4173 | ||
4122 | di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); | 4174 | di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); |
4123 | di_cur = 0; | 4175 | di_cur = 0; |
@@ -4172,6 +4224,15 @@ next: | |||
4172 | path->slots[0]++; | 4224 | path->slots[0]++; |
4173 | } | 4225 | } |
4174 | 4226 | ||
4227 | if (key_type == BTRFS_DIR_INDEX_KEY) { | ||
4228 | if (is_curr) | ||
4229 | filp->f_pos++; | ||
4230 | ret = btrfs_readdir_delayed_dir_index(filp, dirent, filldir, | ||
4231 | &ins_list); | ||
4232 | if (ret) | ||
4233 | goto nopos; | ||
4234 | } | ||
4235 | |||
4175 | /* Reached end of directory/root. Bump pos past the last item. */ | 4236 | /* Reached end of directory/root. Bump pos past the last item. */ |
4176 | if (key_type == BTRFS_DIR_INDEX_KEY) | 4237 | if (key_type == BTRFS_DIR_INDEX_KEY) |
4177 | /* | 4238 | /* |
@@ -4184,6 +4245,8 @@ next: | |||
4184 | nopos: | 4245 | nopos: |
4185 | ret = 0; | 4246 | ret = 0; |
4186 | err: | 4247 | err: |
4248 | if (key_type == BTRFS_DIR_INDEX_KEY) | ||
4249 | btrfs_put_delayed_items(&ins_list, &del_list); | ||
4187 | btrfs_free_path(path); | 4250 | btrfs_free_path(path); |
4188 | return ret; | 4251 | return ret; |
4189 | } | 4252 | } |
@@ -4199,7 +4262,8 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4199 | return 0; | 4262 | return 0; |
4200 | 4263 | ||
4201 | smp_mb(); | 4264 | smp_mb(); |
4202 | nolock = (root->fs_info->closing && root == root->fs_info->tree_root); | 4265 | if (root->fs_info->closing && is_free_space_inode(root, inode)) |
4266 | nolock = true; | ||
4203 | 4267 | ||
4204 | if (wbc->sync_mode == WB_SYNC_ALL) { | 4268 | if (wbc->sync_mode == WB_SYNC_ALL) { |
4205 | if (nolock) | 4269 | if (nolock) |
@@ -4243,8 +4307,9 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4243 | trans = btrfs_start_transaction(root, 1); | 4307 | trans = btrfs_start_transaction(root, 1); |
4244 | if (IS_ERR(trans)) { | 4308 | if (IS_ERR(trans)) { |
4245 | printk_ratelimited(KERN_ERR "btrfs: fail to " | 4309 | printk_ratelimited(KERN_ERR "btrfs: fail to " |
4246 | "dirty inode %lu error %ld\n", | 4310 | "dirty inode %llu error %ld\n", |
4247 | inode->i_ino, PTR_ERR(trans)); | 4311 | (unsigned long long)btrfs_ino(inode), |
4312 | PTR_ERR(trans)); | ||
4248 | return; | 4313 | return; |
4249 | } | 4314 | } |
4250 | btrfs_set_trans_block_group(trans, inode); | 4315 | btrfs_set_trans_block_group(trans, inode); |
@@ -4252,11 +4317,14 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4252 | ret = btrfs_update_inode(trans, root, inode); | 4317 | ret = btrfs_update_inode(trans, root, inode); |
4253 | if (ret) { | 4318 | if (ret) { |
4254 | printk_ratelimited(KERN_ERR "btrfs: fail to " | 4319 | printk_ratelimited(KERN_ERR "btrfs: fail to " |
4255 | "dirty inode %lu error %d\n", | 4320 | "dirty inode %llu error %d\n", |
4256 | inode->i_ino, ret); | 4321 | (unsigned long long)btrfs_ino(inode), |
4322 | ret); | ||
4257 | } | 4323 | } |
4258 | } | 4324 | } |
4259 | btrfs_end_transaction(trans, root); | 4325 | btrfs_end_transaction(trans, root); |
4326 | if (BTRFS_I(inode)->delayed_node) | ||
4327 | btrfs_balance_delayed_items(root); | ||
4260 | } | 4328 | } |
4261 | 4329 | ||
4262 | /* | 4330 | /* |
@@ -4272,7 +4340,7 @@ static int btrfs_set_inode_index_count(struct inode *inode) | |||
4272 | struct extent_buffer *leaf; | 4340 | struct extent_buffer *leaf; |
4273 | int ret; | 4341 | int ret; |
4274 | 4342 | ||
4275 | key.objectid = inode->i_ino; | 4343 | key.objectid = btrfs_ino(inode); |
4276 | btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY); | 4344 | btrfs_set_key_type(&key, BTRFS_DIR_INDEX_KEY); |
4277 | key.offset = (u64)-1; | 4345 | key.offset = (u64)-1; |
4278 | 4346 | ||
@@ -4304,7 +4372,7 @@ static int btrfs_set_inode_index_count(struct inode *inode) | |||
4304 | leaf = path->nodes[0]; | 4372 | leaf = path->nodes[0]; |
4305 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 4373 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
4306 | 4374 | ||
4307 | if (found_key.objectid != inode->i_ino || | 4375 | if (found_key.objectid != btrfs_ino(inode) || |
4308 | btrfs_key_type(&found_key) != BTRFS_DIR_INDEX_KEY) { | 4376 | btrfs_key_type(&found_key) != BTRFS_DIR_INDEX_KEY) { |
4309 | BTRFS_I(inode)->index_cnt = 2; | 4377 | BTRFS_I(inode)->index_cnt = 2; |
4310 | goto out; | 4378 | goto out; |
@@ -4325,9 +4393,12 @@ int btrfs_set_inode_index(struct inode *dir, u64 *index) | |||
4325 | int ret = 0; | 4393 | int ret = 0; |
4326 | 4394 | ||
4327 | if (BTRFS_I(dir)->index_cnt == (u64)-1) { | 4395 | if (BTRFS_I(dir)->index_cnt == (u64)-1) { |
4328 | ret = btrfs_set_inode_index_count(dir); | 4396 | ret = btrfs_inode_delayed_dir_index_count(dir); |
4329 | if (ret) | 4397 | if (ret) { |
4330 | return ret; | 4398 | ret = btrfs_set_inode_index_count(dir); |
4399 | if (ret) | ||
4400 | return ret; | ||
4401 | } | ||
4331 | } | 4402 | } |
4332 | 4403 | ||
4333 | *index = BTRFS_I(dir)->index_cnt; | 4404 | *index = BTRFS_I(dir)->index_cnt; |
@@ -4363,6 +4434,12 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4363 | return ERR_PTR(-ENOMEM); | 4434 | return ERR_PTR(-ENOMEM); |
4364 | } | 4435 | } |
4365 | 4436 | ||
4437 | /* | ||
4438 | * we have to initialize this early, so we can reclaim the inode | ||
4439 | * number if we fail afterwards in this function. | ||
4440 | */ | ||
4441 | inode->i_ino = objectid; | ||
4442 | |||
4366 | if (dir) { | 4443 | if (dir) { |
4367 | trace_btrfs_inode_request(dir); | 4444 | trace_btrfs_inode_request(dir); |
4368 | 4445 | ||
@@ -4408,7 +4485,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4408 | goto fail; | 4485 | goto fail; |
4409 | 4486 | ||
4410 | inode_init_owner(inode, dir, mode); | 4487 | inode_init_owner(inode, dir, mode); |
4411 | inode->i_ino = objectid; | ||
4412 | inode_set_bytes(inode, 0); | 4488 | inode_set_bytes(inode, 0); |
4413 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 4489 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
4414 | inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0], | 4490 | inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0], |
@@ -4472,29 +4548,29 @@ int btrfs_add_link(struct btrfs_trans_handle *trans, | |||
4472 | int ret = 0; | 4548 | int ret = 0; |
4473 | struct btrfs_key key; | 4549 | struct btrfs_key key; |
4474 | struct btrfs_root *root = BTRFS_I(parent_inode)->root; | 4550 | struct btrfs_root *root = BTRFS_I(parent_inode)->root; |
4551 | u64 ino = btrfs_ino(inode); | ||
4552 | u64 parent_ino = btrfs_ino(parent_inode); | ||
4475 | 4553 | ||
4476 | if (unlikely(inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 4554 | if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) { |
4477 | memcpy(&key, &BTRFS_I(inode)->root->root_key, sizeof(key)); | 4555 | memcpy(&key, &BTRFS_I(inode)->root->root_key, sizeof(key)); |
4478 | } else { | 4556 | } else { |
4479 | key.objectid = inode->i_ino; | 4557 | key.objectid = ino; |
4480 | btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); | 4558 | btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); |
4481 | key.offset = 0; | 4559 | key.offset = 0; |
4482 | } | 4560 | } |
4483 | 4561 | ||
4484 | if (unlikely(inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 4562 | if (unlikely(ino == BTRFS_FIRST_FREE_OBJECTID)) { |
4485 | ret = btrfs_add_root_ref(trans, root->fs_info->tree_root, | 4563 | ret = btrfs_add_root_ref(trans, root->fs_info->tree_root, |
4486 | key.objectid, root->root_key.objectid, | 4564 | key.objectid, root->root_key.objectid, |
4487 | parent_inode->i_ino, | 4565 | parent_ino, index, name, name_len); |
4488 | index, name, name_len); | ||
4489 | } else if (add_backref) { | 4566 | } else if (add_backref) { |
4490 | ret = btrfs_insert_inode_ref(trans, root, | 4567 | ret = btrfs_insert_inode_ref(trans, root, name, name_len, ino, |
4491 | name, name_len, inode->i_ino, | 4568 | parent_ino, index); |
4492 | parent_inode->i_ino, index); | ||
4493 | } | 4569 | } |
4494 | 4570 | ||
4495 | if (ret == 0) { | 4571 | if (ret == 0) { |
4496 | ret = btrfs_insert_dir_item(trans, root, name, name_len, | 4572 | ret = btrfs_insert_dir_item(trans, root, name, name_len, |
4497 | parent_inode->i_ino, &key, | 4573 | parent_inode, &key, |
4498 | btrfs_inode_type(inode), index); | 4574 | btrfs_inode_type(inode), index); |
4499 | BUG_ON(ret); | 4575 | BUG_ON(ret); |
4500 | 4576 | ||
@@ -4537,10 +4613,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4537 | if (!new_valid_dev(rdev)) | 4613 | if (!new_valid_dev(rdev)) |
4538 | return -EINVAL; | 4614 | return -EINVAL; |
4539 | 4615 | ||
4540 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
4541 | if (err) | ||
4542 | return err; | ||
4543 | |||
4544 | /* | 4616 | /* |
4545 | * 2 for inode item and ref | 4617 | * 2 for inode item and ref |
4546 | * 2 for dir items | 4618 | * 2 for dir items |
@@ -4552,8 +4624,12 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4552 | 4624 | ||
4553 | btrfs_set_trans_block_group(trans, dir); | 4625 | btrfs_set_trans_block_group(trans, dir); |
4554 | 4626 | ||
4627 | err = btrfs_find_free_ino(root, &objectid); | ||
4628 | if (err) | ||
4629 | goto out_unlock; | ||
4630 | |||
4555 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4631 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4556 | dentry->d_name.len, dir->i_ino, objectid, | 4632 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4557 | BTRFS_I(dir)->block_group, mode, &index); | 4633 | BTRFS_I(dir)->block_group, mode, &index); |
4558 | if (IS_ERR(inode)) { | 4634 | if (IS_ERR(inode)) { |
4559 | err = PTR_ERR(inode); | 4635 | err = PTR_ERR(inode); |
@@ -4600,9 +4676,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4600 | u64 objectid; | 4676 | u64 objectid; |
4601 | u64 index = 0; | 4677 | u64 index = 0; |
4602 | 4678 | ||
4603 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
4604 | if (err) | ||
4605 | return err; | ||
4606 | /* | 4679 | /* |
4607 | * 2 for inode item and ref | 4680 | * 2 for inode item and ref |
4608 | * 2 for dir items | 4681 | * 2 for dir items |
@@ -4614,8 +4687,12 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4614 | 4687 | ||
4615 | btrfs_set_trans_block_group(trans, dir); | 4688 | btrfs_set_trans_block_group(trans, dir); |
4616 | 4689 | ||
4690 | err = btrfs_find_free_ino(root, &objectid); | ||
4691 | if (err) | ||
4692 | goto out_unlock; | ||
4693 | |||
4617 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4694 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4618 | dentry->d_name.len, dir->i_ino, objectid, | 4695 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4619 | BTRFS_I(dir)->block_group, mode, &index); | 4696 | BTRFS_I(dir)->block_group, mode, &index); |
4620 | if (IS_ERR(inode)) { | 4697 | if (IS_ERR(inode)) { |
4621 | err = PTR_ERR(inode); | 4698 | err = PTR_ERR(inode); |
@@ -4726,10 +4803,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4726 | u64 index = 0; | 4803 | u64 index = 0; |
4727 | unsigned long nr = 1; | 4804 | unsigned long nr = 1; |
4728 | 4805 | ||
4729 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
4730 | if (err) | ||
4731 | return err; | ||
4732 | |||
4733 | /* | 4806 | /* |
4734 | * 2 items for inode and ref | 4807 | * 2 items for inode and ref |
4735 | * 2 items for dir items | 4808 | * 2 items for dir items |
@@ -4740,8 +4813,12 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4740 | return PTR_ERR(trans); | 4813 | return PTR_ERR(trans); |
4741 | btrfs_set_trans_block_group(trans, dir); | 4814 | btrfs_set_trans_block_group(trans, dir); |
4742 | 4815 | ||
4816 | err = btrfs_find_free_ino(root, &objectid); | ||
4817 | if (err) | ||
4818 | goto out_fail; | ||
4819 | |||
4743 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 4820 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
4744 | dentry->d_name.len, dir->i_ino, objectid, | 4821 | dentry->d_name.len, btrfs_ino(dir), objectid, |
4745 | BTRFS_I(dir)->block_group, S_IFDIR | mode, | 4822 | BTRFS_I(dir)->block_group, S_IFDIR | mode, |
4746 | &index); | 4823 | &index); |
4747 | if (IS_ERR(inode)) { | 4824 | if (IS_ERR(inode)) { |
@@ -4864,7 +4941,7 @@ struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, | |||
4864 | u64 bytenr; | 4941 | u64 bytenr; |
4865 | u64 extent_start = 0; | 4942 | u64 extent_start = 0; |
4866 | u64 extent_end = 0; | 4943 | u64 extent_end = 0; |
4867 | u64 objectid = inode->i_ino; | 4944 | u64 objectid = btrfs_ino(inode); |
4868 | u32 found_type; | 4945 | u32 found_type; |
4869 | struct btrfs_path *path = NULL; | 4946 | struct btrfs_path *path = NULL; |
4870 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4947 | struct btrfs_root *root = BTRFS_I(inode)->root; |
@@ -5372,7 +5449,7 @@ static noinline int can_nocow_odirect(struct btrfs_trans_handle *trans, | |||
5372 | if (!path) | 5449 | if (!path) |
5373 | return -ENOMEM; | 5450 | return -ENOMEM; |
5374 | 5451 | ||
5375 | ret = btrfs_lookup_file_extent(trans, root, path, inode->i_ino, | 5452 | ret = btrfs_lookup_file_extent(trans, root, path, btrfs_ino(inode), |
5376 | offset, 0); | 5453 | offset, 0); |
5377 | if (ret < 0) | 5454 | if (ret < 0) |
5378 | goto out; | 5455 | goto out; |
@@ -5389,7 +5466,7 @@ static noinline int can_nocow_odirect(struct btrfs_trans_handle *trans, | |||
5389 | ret = 0; | 5466 | ret = 0; |
5390 | leaf = path->nodes[0]; | 5467 | leaf = path->nodes[0]; |
5391 | btrfs_item_key_to_cpu(leaf, &key, slot); | 5468 | btrfs_item_key_to_cpu(leaf, &key, slot); |
5392 | if (key.objectid != inode->i_ino || | 5469 | if (key.objectid != btrfs_ino(inode) || |
5393 | key.type != BTRFS_EXTENT_DATA_KEY) { | 5470 | key.type != BTRFS_EXTENT_DATA_KEY) { |
5394 | /* not our file or wrong item type, must cow */ | 5471 | /* not our file or wrong item type, must cow */ |
5395 | goto out; | 5472 | goto out; |
@@ -5423,7 +5500,7 @@ static noinline int can_nocow_odirect(struct btrfs_trans_handle *trans, | |||
5423 | * look for other files referencing this extent, if we | 5500 | * look for other files referencing this extent, if we |
5424 | * find any we must cow | 5501 | * find any we must cow |
5425 | */ | 5502 | */ |
5426 | if (btrfs_cross_ref_exist(trans, root, inode->i_ino, | 5503 | if (btrfs_cross_ref_exist(trans, root, btrfs_ino(inode), |
5427 | key.offset - backref_offset, disk_bytenr)) | 5504 | key.offset - backref_offset, disk_bytenr)) |
5428 | goto out; | 5505 | goto out; |
5429 | 5506 | ||
@@ -5613,9 +5690,10 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
5613 | 5690 | ||
5614 | flush_dcache_page(bvec->bv_page); | 5691 | flush_dcache_page(bvec->bv_page); |
5615 | if (csum != *private) { | 5692 | if (csum != *private) { |
5616 | printk(KERN_ERR "btrfs csum failed ino %lu off" | 5693 | printk(KERN_ERR "btrfs csum failed ino %llu off" |
5617 | " %llu csum %u private %u\n", | 5694 | " %llu csum %u private %u\n", |
5618 | inode->i_ino, (unsigned long long)start, | 5695 | (unsigned long long)btrfs_ino(inode), |
5696 | (unsigned long long)start, | ||
5619 | csum, *private); | 5697 | csum, *private); |
5620 | err = -EIO; | 5698 | err = -EIO; |
5621 | } | 5699 | } |
@@ -5762,9 +5840,9 @@ static void btrfs_end_dio_bio(struct bio *bio, int err) | |||
5762 | struct btrfs_dio_private *dip = bio->bi_private; | 5840 | struct btrfs_dio_private *dip = bio->bi_private; |
5763 | 5841 | ||
5764 | if (err) { | 5842 | if (err) { |
5765 | printk(KERN_ERR "btrfs direct IO failed ino %lu rw %lu " | 5843 | printk(KERN_ERR "btrfs direct IO failed ino %llu rw %lu " |
5766 | "sector %#Lx len %u err no %d\n", | 5844 | "sector %#Lx len %u err no %d\n", |
5767 | dip->inode->i_ino, bio->bi_rw, | 5845 | (unsigned long long)btrfs_ino(dip->inode), bio->bi_rw, |
5768 | (unsigned long long)bio->bi_sector, bio->bi_size, err); | 5846 | (unsigned long long)bio->bi_sector, bio->bi_size, err); |
5769 | dip->errors = 1; | 5847 | dip->errors = 1; |
5770 | 5848 | ||
@@ -6607,6 +6685,8 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6607 | ei->dummy_inode = 0; | 6685 | ei->dummy_inode = 0; |
6608 | ei->force_compress = BTRFS_COMPRESS_NONE; | 6686 | ei->force_compress = BTRFS_COMPRESS_NONE; |
6609 | 6687 | ||
6688 | ei->delayed_node = NULL; | ||
6689 | |||
6610 | inode = &ei->vfs_inode; | 6690 | inode = &ei->vfs_inode; |
6611 | extent_map_tree_init(&ei->extent_tree); | 6691 | extent_map_tree_init(&ei->extent_tree); |
6612 | extent_io_tree_init(&ei->io_tree, &inode->i_data); | 6692 | extent_io_tree_init(&ei->io_tree, &inode->i_data); |
@@ -6674,8 +6754,8 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6674 | 6754 | ||
6675 | spin_lock(&root->orphan_lock); | 6755 | spin_lock(&root->orphan_lock); |
6676 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { | 6756 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { |
6677 | printk(KERN_INFO "BTRFS: inode %lu still on the orphan list\n", | 6757 | printk(KERN_INFO "BTRFS: inode %llu still on the orphan list\n", |
6678 | inode->i_ino); | 6758 | (unsigned long long)btrfs_ino(inode)); |
6679 | list_del_init(&BTRFS_I(inode)->i_orphan); | 6759 | list_del_init(&BTRFS_I(inode)->i_orphan); |
6680 | } | 6760 | } |
6681 | spin_unlock(&root->orphan_lock); | 6761 | spin_unlock(&root->orphan_lock); |
@@ -6697,6 +6777,7 @@ void btrfs_destroy_inode(struct inode *inode) | |||
6697 | inode_tree_del(inode); | 6777 | inode_tree_del(inode); |
6698 | btrfs_drop_extent_cache(inode, 0, (u64)-1, 0); | 6778 | btrfs_drop_extent_cache(inode, 0, (u64)-1, 0); |
6699 | free: | 6779 | free: |
6780 | btrfs_remove_delayed_node(inode); | ||
6700 | call_rcu(&inode->i_rcu, btrfs_i_callback); | 6781 | call_rcu(&inode->i_rcu, btrfs_i_callback); |
6701 | } | 6782 | } |
6702 | 6783 | ||
@@ -6705,7 +6786,7 @@ int btrfs_drop_inode(struct inode *inode) | |||
6705 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6786 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6706 | 6787 | ||
6707 | if (btrfs_root_refs(&root->root_item) == 0 && | 6788 | if (btrfs_root_refs(&root->root_item) == 0 && |
6708 | root != root->fs_info->tree_root) | 6789 | !is_free_space_inode(root, inode)) |
6709 | return 1; | 6790 | return 1; |
6710 | else | 6791 | else |
6711 | return generic_drop_inode(inode); | 6792 | return generic_drop_inode(inode); |
@@ -6808,38 +6889,39 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6808 | struct btrfs_trans_handle *trans; | 6889 | struct btrfs_trans_handle *trans; |
6809 | struct btrfs_root *root = BTRFS_I(old_dir)->root; | 6890 | struct btrfs_root *root = BTRFS_I(old_dir)->root; |
6810 | struct btrfs_root *dest = BTRFS_I(new_dir)->root; | 6891 | struct btrfs_root *dest = BTRFS_I(new_dir)->root; |
6811 | struct inode *newinode = new_dentry->d_inode; | 6892 | struct inode *new_inode = new_dentry->d_inode; |
6812 | struct inode *old_inode = old_dentry->d_inode; | 6893 | struct inode *old_inode = old_dentry->d_inode; |
6813 | struct timespec ctime = CURRENT_TIME; | 6894 | struct timespec ctime = CURRENT_TIME; |
6814 | u64 index = 0; | 6895 | u64 index = 0; |
6815 | u64 root_objectid; | 6896 | u64 root_objectid; |
6816 | int ret; | 6897 | int ret; |
6898 | u64 old_ino = btrfs_ino(old_inode); | ||
6817 | 6899 | ||
6818 | if (new_dir->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) | 6900 | if (btrfs_ino(new_dir) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) |
6819 | return -EPERM; | 6901 | return -EPERM; |
6820 | 6902 | ||
6821 | /* we only allow rename subvolume link between subvolumes */ | 6903 | /* we only allow rename subvolume link between subvolumes */ |
6822 | if (old_inode->i_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest) | 6904 | if (old_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest) |
6823 | return -EXDEV; | 6905 | return -EXDEV; |
6824 | 6906 | ||
6825 | if (old_inode->i_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID || | 6907 | if (old_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID || |
6826 | (newinode && newinode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) | 6908 | (new_inode && btrfs_ino(new_inode) == BTRFS_FIRST_FREE_OBJECTID)) |
6827 | return -ENOTEMPTY; | 6909 | return -ENOTEMPTY; |
6828 | 6910 | ||
6829 | if (S_ISDIR(old_inode->i_mode) && newinode && | 6911 | if (S_ISDIR(old_inode->i_mode) && new_inode && |
6830 | newinode->i_size > BTRFS_EMPTY_DIR_SIZE) | 6912 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
6831 | return -ENOTEMPTY; | 6913 | return -ENOTEMPTY; |
6832 | /* | 6914 | /* |
6833 | * we're using rename to replace one file with another. | 6915 | * we're using rename to replace one file with another. |
6834 | * and the replacement file is large. Start IO on it now so | 6916 | * and the replacement file is large. Start IO on it now so |
6835 | * we don't add too much work to the end of the transaction | 6917 | * we don't add too much work to the end of the transaction |
6836 | */ | 6918 | */ |
6837 | if (newinode && S_ISREG(old_inode->i_mode) && newinode->i_size && | 6919 | if (new_inode && S_ISREG(old_inode->i_mode) && new_inode->i_size && |
6838 | old_inode->i_size > BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT) | 6920 | old_inode->i_size > BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT) |
6839 | filemap_flush(old_inode->i_mapping); | 6921 | filemap_flush(old_inode->i_mapping); |
6840 | 6922 | ||
6841 | /* close the racy window with snapshot create/destroy ioctl */ | 6923 | /* close the racy window with snapshot create/destroy ioctl */ |
6842 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 6924 | if (old_ino == BTRFS_FIRST_FREE_OBJECTID) |
6843 | down_read(&root->fs_info->subvol_sem); | 6925 | down_read(&root->fs_info->subvol_sem); |
6844 | /* | 6926 | /* |
6845 | * We want to reserve the absolute worst case amount of items. So if | 6927 | * We want to reserve the absolute worst case amount of items. So if |
@@ -6864,15 +6946,15 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6864 | if (ret) | 6946 | if (ret) |
6865 | goto out_fail; | 6947 | goto out_fail; |
6866 | 6948 | ||
6867 | if (unlikely(old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 6949 | if (unlikely(old_ino == BTRFS_FIRST_FREE_OBJECTID)) { |
6868 | /* force full log commit if subvolume involved. */ | 6950 | /* force full log commit if subvolume involved. */ |
6869 | root->fs_info->last_trans_log_full_commit = trans->transid; | 6951 | root->fs_info->last_trans_log_full_commit = trans->transid; |
6870 | } else { | 6952 | } else { |
6871 | ret = btrfs_insert_inode_ref(trans, dest, | 6953 | ret = btrfs_insert_inode_ref(trans, dest, |
6872 | new_dentry->d_name.name, | 6954 | new_dentry->d_name.name, |
6873 | new_dentry->d_name.len, | 6955 | new_dentry->d_name.len, |
6874 | old_inode->i_ino, | 6956 | old_ino, |
6875 | new_dir->i_ino, index); | 6957 | btrfs_ino(new_dir), index); |
6876 | if (ret) | 6958 | if (ret) |
6877 | goto out_fail; | 6959 | goto out_fail; |
6878 | /* | 6960 | /* |
@@ -6888,10 +6970,8 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6888 | * make sure the inode gets flushed if it is replacing | 6970 | * make sure the inode gets flushed if it is replacing |
6889 | * something. | 6971 | * something. |
6890 | */ | 6972 | */ |
6891 | if (newinode && newinode->i_size && | 6973 | if (new_inode && new_inode->i_size && S_ISREG(old_inode->i_mode)) |
6892 | old_inode && S_ISREG(old_inode->i_mode)) { | ||
6893 | btrfs_add_ordered_operation(trans, root, old_inode); | 6974 | btrfs_add_ordered_operation(trans, root, old_inode); |
6894 | } | ||
6895 | 6975 | ||
6896 | old_dir->i_ctime = old_dir->i_mtime = ctime; | 6976 | old_dir->i_ctime = old_dir->i_mtime = ctime; |
6897 | new_dir->i_ctime = new_dir->i_mtime = ctime; | 6977 | new_dir->i_ctime = new_dir->i_mtime = ctime; |
@@ -6900,7 +6980,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6900 | if (old_dentry->d_parent != new_dentry->d_parent) | 6980 | if (old_dentry->d_parent != new_dentry->d_parent) |
6901 | btrfs_record_unlink_dir(trans, old_dir, old_inode, 1); | 6981 | btrfs_record_unlink_dir(trans, old_dir, old_inode, 1); |
6902 | 6982 | ||
6903 | if (unlikely(old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID)) { | 6983 | if (unlikely(old_ino == BTRFS_FIRST_FREE_OBJECTID)) { |
6904 | root_objectid = BTRFS_I(old_inode)->root->root_key.objectid; | 6984 | root_objectid = BTRFS_I(old_inode)->root->root_key.objectid; |
6905 | ret = btrfs_unlink_subvol(trans, root, old_dir, root_objectid, | 6985 | ret = btrfs_unlink_subvol(trans, root, old_dir, root_objectid, |
6906 | old_dentry->d_name.name, | 6986 | old_dentry->d_name.name, |
@@ -6915,16 +6995,16 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6915 | } | 6995 | } |
6916 | BUG_ON(ret); | 6996 | BUG_ON(ret); |
6917 | 6997 | ||
6918 | if (newinode) { | 6998 | if (new_inode) { |
6919 | newinode->i_ctime = CURRENT_TIME; | 6999 | new_inode->i_ctime = CURRENT_TIME; |
6920 | if (unlikely(newinode->i_ino == | 7000 | if (unlikely(btrfs_ino(new_inode) == |
6921 | BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { | 7001 | BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) { |
6922 | root_objectid = BTRFS_I(newinode)->location.objectid; | 7002 | root_objectid = BTRFS_I(new_inode)->location.objectid; |
6923 | ret = btrfs_unlink_subvol(trans, dest, new_dir, | 7003 | ret = btrfs_unlink_subvol(trans, dest, new_dir, |
6924 | root_objectid, | 7004 | root_objectid, |
6925 | new_dentry->d_name.name, | 7005 | new_dentry->d_name.name, |
6926 | new_dentry->d_name.len); | 7006 | new_dentry->d_name.len); |
6927 | BUG_ON(newinode->i_nlink == 0); | 7007 | BUG_ON(new_inode->i_nlink == 0); |
6928 | } else { | 7008 | } else { |
6929 | ret = btrfs_unlink_inode(trans, dest, new_dir, | 7009 | ret = btrfs_unlink_inode(trans, dest, new_dir, |
6930 | new_dentry->d_inode, | 7010 | new_dentry->d_inode, |
@@ -6932,7 +7012,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6932 | new_dentry->d_name.len); | 7012 | new_dentry->d_name.len); |
6933 | } | 7013 | } |
6934 | BUG_ON(ret); | 7014 | BUG_ON(ret); |
6935 | if (newinode->i_nlink == 0) { | 7015 | if (new_inode->i_nlink == 0) { |
6936 | ret = btrfs_orphan_add(trans, new_dentry->d_inode); | 7016 | ret = btrfs_orphan_add(trans, new_dentry->d_inode); |
6937 | BUG_ON(ret); | 7017 | BUG_ON(ret); |
6938 | } | 7018 | } |
@@ -6945,7 +7025,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6945 | new_dentry->d_name.len, 0, index); | 7025 | new_dentry->d_name.len, 0, index); |
6946 | BUG_ON(ret); | 7026 | BUG_ON(ret); |
6947 | 7027 | ||
6948 | if (old_inode->i_ino != BTRFS_FIRST_FREE_OBJECTID) { | 7028 | if (old_ino != BTRFS_FIRST_FREE_OBJECTID) { |
6949 | struct dentry *parent = dget_parent(new_dentry); | 7029 | struct dentry *parent = dget_parent(new_dentry); |
6950 | btrfs_log_new_name(trans, old_inode, old_dir, parent); | 7030 | btrfs_log_new_name(trans, old_inode, old_dir, parent); |
6951 | dput(parent); | 7031 | dput(parent); |
@@ -6954,7 +7034,7 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
6954 | out_fail: | 7034 | out_fail: |
6955 | btrfs_end_transaction_throttle(trans, root); | 7035 | btrfs_end_transaction_throttle(trans, root); |
6956 | out_notrans: | 7036 | out_notrans: |
6957 | if (old_inode->i_ino == BTRFS_FIRST_FREE_OBJECTID) | 7037 | if (old_ino == BTRFS_FIRST_FREE_OBJECTID) |
6958 | up_read(&root->fs_info->subvol_sem); | 7038 | up_read(&root->fs_info->subvol_sem); |
6959 | 7039 | ||
6960 | return ret; | 7040 | return ret; |
@@ -7031,9 +7111,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7031 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) | 7111 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) |
7032 | return -ENAMETOOLONG; | 7112 | return -ENAMETOOLONG; |
7033 | 7113 | ||
7034 | err = btrfs_find_free_objectid(NULL, root, dir->i_ino, &objectid); | ||
7035 | if (err) | ||
7036 | return err; | ||
7037 | /* | 7114 | /* |
7038 | * 2 items for inode item and ref | 7115 | * 2 items for inode item and ref |
7039 | * 2 items for dir items | 7116 | * 2 items for dir items |
@@ -7045,8 +7122,12 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7045 | 7122 | ||
7046 | btrfs_set_trans_block_group(trans, dir); | 7123 | btrfs_set_trans_block_group(trans, dir); |
7047 | 7124 | ||
7125 | err = btrfs_find_free_ino(root, &objectid); | ||
7126 | if (err) | ||
7127 | goto out_unlock; | ||
7128 | |||
7048 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, | 7129 | inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, |
7049 | dentry->d_name.len, dir->i_ino, objectid, | 7130 | dentry->d_name.len, btrfs_ino(dir), objectid, |
7050 | BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, | 7131 | BTRFS_I(dir)->block_group, S_IFLNK|S_IRWXUGO, |
7051 | &index); | 7132 | &index); |
7052 | if (IS_ERR(inode)) { | 7133 | if (IS_ERR(inode)) { |
@@ -7078,7 +7159,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7078 | 7159 | ||
7079 | path = btrfs_alloc_path(); | 7160 | path = btrfs_alloc_path(); |
7080 | BUG_ON(!path); | 7161 | BUG_ON(!path); |
7081 | key.objectid = inode->i_ino; | 7162 | key.objectid = btrfs_ino(inode); |
7082 | key.offset = 0; | 7163 | key.offset = 0; |
7083 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); | 7164 | btrfs_set_key_type(&key, BTRFS_EXTENT_DATA_KEY); |
7084 | datasize = btrfs_file_extent_calc_inline_size(name_len); | 7165 | datasize = btrfs_file_extent_calc_inline_size(name_len); |