diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 202 |
1 files changed, 153 insertions, 49 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 64f99cf69ce0..558cac2dfa54 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -319,8 +319,6 @@ static noinline int compress_file_range(struct inode *inode, | |||
| 319 | struct btrfs_root *root = BTRFS_I(inode)->root; | 319 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 320 | struct btrfs_trans_handle *trans; | 320 | struct btrfs_trans_handle *trans; |
| 321 | u64 num_bytes; | 321 | u64 num_bytes; |
| 322 | u64 orig_start; | ||
| 323 | u64 disk_num_bytes; | ||
| 324 | u64 blocksize = root->sectorsize; | 322 | u64 blocksize = root->sectorsize; |
| 325 | u64 actual_end; | 323 | u64 actual_end; |
| 326 | u64 isize = i_size_read(inode); | 324 | u64 isize = i_size_read(inode); |
| @@ -335,8 +333,6 @@ static noinline int compress_file_range(struct inode *inode, | |||
| 335 | int i; | 333 | int i; |
| 336 | int will_compress; | 334 | int will_compress; |
| 337 | 335 | ||
| 338 | orig_start = start; | ||
| 339 | |||
| 340 | actual_end = min_t(u64, isize, end + 1); | 336 | actual_end = min_t(u64, isize, end + 1); |
| 341 | again: | 337 | again: |
| 342 | will_compress = 0; | 338 | will_compress = 0; |
| @@ -371,7 +367,6 @@ again: | |||
| 371 | total_compressed = min(total_compressed, max_uncompressed); | 367 | total_compressed = min(total_compressed, max_uncompressed); |
| 372 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 368 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); |
| 373 | num_bytes = max(blocksize, num_bytes); | 369 | num_bytes = max(blocksize, num_bytes); |
| 374 | disk_num_bytes = num_bytes; | ||
| 375 | total_in = 0; | 370 | total_in = 0; |
| 376 | ret = 0; | 371 | ret = 0; |
| 377 | 372 | ||
| @@ -467,7 +462,6 @@ again: | |||
| 467 | if (total_compressed >= total_in) { | 462 | if (total_compressed >= total_in) { |
| 468 | will_compress = 0; | 463 | will_compress = 0; |
| 469 | } else { | 464 | } else { |
| 470 | disk_num_bytes = total_compressed; | ||
| 471 | num_bytes = total_in; | 465 | num_bytes = total_in; |
| 472 | } | 466 | } |
| 473 | } | 467 | } |
| @@ -757,20 +751,17 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 757 | u64 disk_num_bytes; | 751 | u64 disk_num_bytes; |
| 758 | u64 cur_alloc_size; | 752 | u64 cur_alloc_size; |
| 759 | u64 blocksize = root->sectorsize; | 753 | u64 blocksize = root->sectorsize; |
| 760 | u64 actual_end; | ||
| 761 | u64 isize = i_size_read(inode); | ||
| 762 | struct btrfs_key ins; | 754 | struct btrfs_key ins; |
| 763 | struct extent_map *em; | 755 | struct extent_map *em; |
| 764 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 756 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
| 765 | int ret = 0; | 757 | int ret = 0; |
| 766 | 758 | ||
| 759 | BUG_ON(root == root->fs_info->tree_root); | ||
| 767 | trans = btrfs_join_transaction(root, 1); | 760 | trans = btrfs_join_transaction(root, 1); |
| 768 | BUG_ON(!trans); | 761 | BUG_ON(!trans); |
| 769 | btrfs_set_trans_block_group(trans, inode); | 762 | btrfs_set_trans_block_group(trans, inode); |
| 770 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 763 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 771 | 764 | ||
| 772 | actual_end = min_t(u64, isize, end + 1); | ||
| 773 | |||
| 774 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 765 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); |
| 775 | num_bytes = max(blocksize, num_bytes); | 766 | num_bytes = max(blocksize, num_bytes); |
| 776 | disk_num_bytes = num_bytes; | 767 | disk_num_bytes = num_bytes; |
| @@ -1035,10 +1026,16 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
| 1035 | int type; | 1026 | int type; |
| 1036 | int nocow; | 1027 | int nocow; |
| 1037 | int check_prev = 1; | 1028 | int check_prev = 1; |
| 1029 | bool nolock = false; | ||
| 1038 | 1030 | ||
| 1039 | path = btrfs_alloc_path(); | 1031 | path = btrfs_alloc_path(); |
| 1040 | BUG_ON(!path); | 1032 | BUG_ON(!path); |
| 1041 | trans = btrfs_join_transaction(root, 1); | 1033 | if (root == root->fs_info->tree_root) { |
| 1034 | nolock = true; | ||
| 1035 | trans = btrfs_join_transaction_nolock(root, 1); | ||
| 1036 | } else { | ||
| 1037 | trans = btrfs_join_transaction(root, 1); | ||
| 1038 | } | ||
| 1042 | BUG_ON(!trans); | 1039 | BUG_ON(!trans); |
| 1043 | 1040 | ||
| 1044 | cow_start = (u64)-1; | 1041 | cow_start = (u64)-1; |
| @@ -1211,8 +1208,13 @@ out_check: | |||
| 1211 | BUG_ON(ret); | 1208 | BUG_ON(ret); |
| 1212 | } | 1209 | } |
| 1213 | 1210 | ||
| 1214 | ret = btrfs_end_transaction(trans, root); | 1211 | if (nolock) { |
| 1215 | BUG_ON(ret); | 1212 | ret = btrfs_end_transaction_nolock(trans, root); |
| 1213 | BUG_ON(ret); | ||
| 1214 | } else { | ||
| 1215 | ret = btrfs_end_transaction(trans, root); | ||
| 1216 | BUG_ON(ret); | ||
| 1217 | } | ||
| 1216 | btrfs_free_path(path); | 1218 | btrfs_free_path(path); |
| 1217 | return 0; | 1219 | return 0; |
| 1218 | } | 1220 | } |
| @@ -1289,6 +1291,8 @@ static int btrfs_set_bit_hook(struct inode *inode, | |||
| 1289 | if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { | 1291 | if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { |
| 1290 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1292 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 1291 | u64 len = state->end + 1 - state->start; | 1293 | u64 len = state->end + 1 - state->start; |
| 1294 | int do_list = (root->root_key.objectid != | ||
| 1295 | BTRFS_ROOT_TREE_OBJECTID); | ||
| 1292 | 1296 | ||
| 1293 | if (*bits & EXTENT_FIRST_DELALLOC) | 1297 | if (*bits & EXTENT_FIRST_DELALLOC) |
| 1294 | *bits &= ~EXTENT_FIRST_DELALLOC; | 1298 | *bits &= ~EXTENT_FIRST_DELALLOC; |
| @@ -1298,7 +1302,7 @@ static int btrfs_set_bit_hook(struct inode *inode, | |||
| 1298 | spin_lock(&root->fs_info->delalloc_lock); | 1302 | spin_lock(&root->fs_info->delalloc_lock); |
| 1299 | BTRFS_I(inode)->delalloc_bytes += len; | 1303 | BTRFS_I(inode)->delalloc_bytes += len; |
| 1300 | root->fs_info->delalloc_bytes += len; | 1304 | root->fs_info->delalloc_bytes += len; |
| 1301 | if (list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1305 | if (do_list && list_empty(&BTRFS_I(inode)->delalloc_inodes)) { |
| 1302 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, | 1306 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, |
| 1303 | &root->fs_info->delalloc_inodes); | 1307 | &root->fs_info->delalloc_inodes); |
| 1304 | } | 1308 | } |
| @@ -1321,6 +1325,8 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
| 1321 | if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { | 1325 | if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { |
| 1322 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1326 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 1323 | u64 len = state->end + 1 - state->start; | 1327 | u64 len = state->end + 1 - state->start; |
| 1328 | int do_list = (root->root_key.objectid != | ||
| 1329 | BTRFS_ROOT_TREE_OBJECTID); | ||
| 1324 | 1330 | ||
| 1325 | if (*bits & EXTENT_FIRST_DELALLOC) | 1331 | if (*bits & EXTENT_FIRST_DELALLOC) |
| 1326 | *bits &= ~EXTENT_FIRST_DELALLOC; | 1332 | *bits &= ~EXTENT_FIRST_DELALLOC; |
| @@ -1330,14 +1336,15 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
| 1330 | if (*bits & EXTENT_DO_ACCOUNTING) | 1336 | if (*bits & EXTENT_DO_ACCOUNTING) |
| 1331 | btrfs_delalloc_release_metadata(inode, len); | 1337 | btrfs_delalloc_release_metadata(inode, len); |
| 1332 | 1338 | ||
| 1333 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) | 1339 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID |
| 1340 | && do_list) | ||
| 1334 | btrfs_free_reserved_data_space(inode, len); | 1341 | btrfs_free_reserved_data_space(inode, len); |
| 1335 | 1342 | ||
| 1336 | spin_lock(&root->fs_info->delalloc_lock); | 1343 | spin_lock(&root->fs_info->delalloc_lock); |
| 1337 | root->fs_info->delalloc_bytes -= len; | 1344 | root->fs_info->delalloc_bytes -= len; |
| 1338 | BTRFS_I(inode)->delalloc_bytes -= len; | 1345 | BTRFS_I(inode)->delalloc_bytes -= len; |
| 1339 | 1346 | ||
| 1340 | if (BTRFS_I(inode)->delalloc_bytes == 0 && | 1347 | if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 && |
| 1341 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1348 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { |
| 1342 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); | 1349 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); |
| 1343 | } | 1350 | } |
| @@ -1372,7 +1379,7 @@ int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | |||
| 1372 | 1379 | ||
| 1373 | if (map_length < length + size) | 1380 | if (map_length < length + size) |
| 1374 | return 1; | 1381 | return 1; |
| 1375 | return 0; | 1382 | return ret; |
| 1376 | } | 1383 | } |
| 1377 | 1384 | ||
| 1378 | /* | 1385 | /* |
| @@ -1426,7 +1433,10 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
| 1426 | 1433 | ||
| 1427 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 1434 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
| 1428 | 1435 | ||
| 1429 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | 1436 | if (root == root->fs_info->tree_root) |
| 1437 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2); | ||
| 1438 | else | ||
| 1439 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | ||
| 1430 | BUG_ON(ret); | 1440 | BUG_ON(ret); |
| 1431 | 1441 | ||
| 1432 | if (!(rw & REQ_WRITE)) { | 1442 | if (!(rw & REQ_WRITE)) { |
| @@ -1662,6 +1672,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1662 | struct extent_state *cached_state = NULL; | 1672 | struct extent_state *cached_state = NULL; |
| 1663 | int compressed = 0; | 1673 | int compressed = 0; |
| 1664 | int ret; | 1674 | int ret; |
| 1675 | bool nolock = false; | ||
| 1665 | 1676 | ||
| 1666 | ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, | 1677 | ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, |
| 1667 | end - start + 1); | 1678 | end - start + 1); |
| @@ -1669,11 +1680,17 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1669 | return 0; | 1680 | return 0; |
| 1670 | BUG_ON(!ordered_extent); | 1681 | BUG_ON(!ordered_extent); |
| 1671 | 1682 | ||
| 1683 | nolock = (root == root->fs_info->tree_root); | ||
| 1684 | |||
| 1672 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { | 1685 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
| 1673 | BUG_ON(!list_empty(&ordered_extent->list)); | 1686 | BUG_ON(!list_empty(&ordered_extent->list)); |
| 1674 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1687 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
| 1675 | if (!ret) { | 1688 | if (!ret) { |
| 1676 | trans = btrfs_join_transaction(root, 1); | 1689 | if (nolock) |
| 1690 | trans = btrfs_join_transaction_nolock(root, 1); | ||
| 1691 | else | ||
| 1692 | trans = btrfs_join_transaction(root, 1); | ||
| 1693 | BUG_ON(!trans); | ||
| 1677 | btrfs_set_trans_block_group(trans, inode); | 1694 | btrfs_set_trans_block_group(trans, inode); |
| 1678 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1695 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 1679 | ret = btrfs_update_inode(trans, root, inode); | 1696 | ret = btrfs_update_inode(trans, root, inode); |
| @@ -1686,7 +1703,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1686 | ordered_extent->file_offset + ordered_extent->len - 1, | 1703 | ordered_extent->file_offset + ordered_extent->len - 1, |
| 1687 | 0, &cached_state, GFP_NOFS); | 1704 | 0, &cached_state, GFP_NOFS); |
| 1688 | 1705 | ||
| 1689 | trans = btrfs_join_transaction(root, 1); | 1706 | if (nolock) |
| 1707 | trans = btrfs_join_transaction_nolock(root, 1); | ||
| 1708 | else | ||
| 1709 | trans = btrfs_join_transaction(root, 1); | ||
| 1690 | btrfs_set_trans_block_group(trans, inode); | 1710 | btrfs_set_trans_block_group(trans, inode); |
| 1691 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1711 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 1692 | 1712 | ||
| @@ -1700,6 +1720,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1700 | ordered_extent->len); | 1720 | ordered_extent->len); |
| 1701 | BUG_ON(ret); | 1721 | BUG_ON(ret); |
| 1702 | } else { | 1722 | } else { |
| 1723 | BUG_ON(root == root->fs_info->tree_root); | ||
| 1703 | ret = insert_reserved_file_extent(trans, inode, | 1724 | ret = insert_reserved_file_extent(trans, inode, |
| 1704 | ordered_extent->file_offset, | 1725 | ordered_extent->file_offset, |
| 1705 | ordered_extent->start, | 1726 | ordered_extent->start, |
| @@ -1724,9 +1745,15 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
| 1724 | ret = btrfs_update_inode(trans, root, inode); | 1745 | ret = btrfs_update_inode(trans, root, inode); |
| 1725 | BUG_ON(ret); | 1746 | BUG_ON(ret); |
| 1726 | out: | 1747 | out: |
| 1727 | btrfs_delalloc_release_metadata(inode, ordered_extent->len); | 1748 | if (nolock) { |
| 1728 | if (trans) | 1749 | if (trans) |
| 1729 | btrfs_end_transaction(trans, root); | 1750 | btrfs_end_transaction_nolock(trans, root); |
| 1751 | } else { | ||
| 1752 | btrfs_delalloc_release_metadata(inode, ordered_extent->len); | ||
| 1753 | if (trans) | ||
| 1754 | btrfs_end_transaction(trans, root); | ||
| 1755 | } | ||
| 1756 | |||
| 1730 | /* once for us */ | 1757 | /* once for us */ |
| 1731 | btrfs_put_ordered_extent(ordered_extent); | 1758 | btrfs_put_ordered_extent(ordered_extent); |
| 1732 | /* once for the tree */ | 1759 | /* once for the tree */ |
| @@ -2237,7 +2264,6 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2237 | { | 2264 | { |
| 2238 | struct btrfs_path *path; | 2265 | struct btrfs_path *path; |
| 2239 | struct extent_buffer *leaf; | 2266 | struct extent_buffer *leaf; |
| 2240 | struct btrfs_item *item; | ||
| 2241 | struct btrfs_key key, found_key; | 2267 | struct btrfs_key key, found_key; |
| 2242 | struct btrfs_trans_handle *trans; | 2268 | struct btrfs_trans_handle *trans; |
| 2243 | struct inode *inode; | 2269 | struct inode *inode; |
| @@ -2275,7 +2301,6 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2275 | 2301 | ||
| 2276 | /* pull out the item */ | 2302 | /* pull out the item */ |
| 2277 | leaf = path->nodes[0]; | 2303 | leaf = path->nodes[0]; |
| 2278 | item = btrfs_item_nr(leaf, path->slots[0]); | ||
| 2279 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 2304 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
| 2280 | 2305 | ||
| 2281 | /* make sure the item matches what we want */ | 2306 | /* make sure the item matches what we want */ |
| @@ -2651,7 +2676,8 @@ int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
| 2651 | 2676 | ||
| 2652 | ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, | 2677 | ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, |
| 2653 | dir, index); | 2678 | dir, index); |
| 2654 | BUG_ON(ret); | 2679 | if (ret == -ENOENT) |
| 2680 | ret = 0; | ||
| 2655 | err: | 2681 | err: |
| 2656 | btrfs_free_path(path); | 2682 | btrfs_free_path(path); |
| 2657 | if (ret) | 2683 | if (ret) |
| @@ -2672,8 +2698,8 @@ static int check_path_shared(struct btrfs_root *root, | |||
| 2672 | { | 2698 | { |
| 2673 | struct extent_buffer *eb; | 2699 | struct extent_buffer *eb; |
| 2674 | int level; | 2700 | int level; |
| 2675 | int ret; | ||
| 2676 | u64 refs = 1; | 2701 | u64 refs = 1; |
| 2702 | int uninitialized_var(ret); | ||
| 2677 | 2703 | ||
| 2678 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { | 2704 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { |
| 2679 | if (!path->nodes[level]) | 2705 | if (!path->nodes[level]) |
| @@ -2686,7 +2712,7 @@ static int check_path_shared(struct btrfs_root *root, | |||
| 2686 | if (refs > 1) | 2712 | if (refs > 1) |
| 2687 | return 1; | 2713 | return 1; |
| 2688 | } | 2714 | } |
| 2689 | return 0; | 2715 | return ret; /* XXX callers? */ |
| 2690 | } | 2716 | } |
| 2691 | 2717 | ||
| 2692 | /* | 2718 | /* |
| @@ -3196,7 +3222,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | |||
| 3196 | 3222 | ||
| 3197 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); | 3223 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); |
| 3198 | 3224 | ||
| 3199 | if (root->ref_cows) | 3225 | if (root->ref_cows || root == root->fs_info->tree_root) |
| 3200 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); | 3226 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); |
| 3201 | 3227 | ||
| 3202 | path = btrfs_alloc_path(); | 3228 | path = btrfs_alloc_path(); |
| @@ -3344,7 +3370,8 @@ delete: | |||
| 3344 | } else { | 3370 | } else { |
| 3345 | break; | 3371 | break; |
| 3346 | } | 3372 | } |
| 3347 | if (found_extent && root->ref_cows) { | 3373 | if (found_extent && (root->ref_cows || |
| 3374 | root == root->fs_info->tree_root)) { | ||
| 3348 | btrfs_set_path_blocking(path); | 3375 | btrfs_set_path_blocking(path); |
| 3349 | ret = btrfs_free_extent(trans, root, extent_start, | 3376 | ret = btrfs_free_extent(trans, root, extent_start, |
| 3350 | extent_num_bytes, 0, | 3377 | extent_num_bytes, 0, |
| @@ -3675,7 +3702,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
| 3675 | int ret; | 3702 | int ret; |
| 3676 | 3703 | ||
| 3677 | truncate_inode_pages(&inode->i_data, 0); | 3704 | truncate_inode_pages(&inode->i_data, 0); |
| 3678 | if (inode->i_nlink && btrfs_root_refs(&root->root_item) != 0) | 3705 | if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 || |
| 3706 | root == root->fs_info->tree_root)) | ||
| 3679 | goto no_delete; | 3707 | goto no_delete; |
| 3680 | 3708 | ||
| 3681 | if (is_bad_inode(inode)) { | 3709 | if (is_bad_inode(inode)) { |
| @@ -3888,7 +3916,14 @@ static void inode_tree_del(struct inode *inode) | |||
| 3888 | } | 3916 | } |
| 3889 | spin_unlock(&root->inode_lock); | 3917 | spin_unlock(&root->inode_lock); |
| 3890 | 3918 | ||
| 3891 | if (empty && btrfs_root_refs(&root->root_item) == 0) { | 3919 | /* |
| 3920 | * Free space cache has inodes in the tree root, but the tree root has a | ||
| 3921 | * root_refs of 0, so this could end up dropping the tree root as a | ||
| 3922 | * snapshot, so we need the extra !root->fs_info->tree_root check to | ||
| 3923 | * make sure we don't drop it. | ||
| 3924 | */ | ||
| 3925 | if (empty && btrfs_root_refs(&root->root_item) == 0 && | ||
| 3926 | root != root->fs_info->tree_root) { | ||
| 3892 | synchronize_srcu(&root->fs_info->subvol_srcu); | 3927 | synchronize_srcu(&root->fs_info->subvol_srcu); |
| 3893 | spin_lock(&root->inode_lock); | 3928 | spin_lock(&root->inode_lock); |
| 3894 | empty = RB_EMPTY_ROOT(&root->inode_tree); | 3929 | empty = RB_EMPTY_ROOT(&root->inode_tree); |
| @@ -4282,14 +4317,24 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 4282 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4317 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 4283 | struct btrfs_trans_handle *trans; | 4318 | struct btrfs_trans_handle *trans; |
| 4284 | int ret = 0; | 4319 | int ret = 0; |
| 4320 | bool nolock = false; | ||
| 4285 | 4321 | ||
| 4286 | if (BTRFS_I(inode)->dummy_inode) | 4322 | if (BTRFS_I(inode)->dummy_inode) |
| 4287 | return 0; | 4323 | return 0; |
| 4288 | 4324 | ||
| 4325 | smp_mb(); | ||
| 4326 | nolock = (root->fs_info->closing && root == root->fs_info->tree_root); | ||
| 4327 | |||
| 4289 | if (wbc->sync_mode == WB_SYNC_ALL) { | 4328 | if (wbc->sync_mode == WB_SYNC_ALL) { |
| 4290 | trans = btrfs_join_transaction(root, 1); | 4329 | if (nolock) |
| 4330 | trans = btrfs_join_transaction_nolock(root, 1); | ||
| 4331 | else | ||
| 4332 | trans = btrfs_join_transaction(root, 1); | ||
| 4291 | btrfs_set_trans_block_group(trans, inode); | 4333 | btrfs_set_trans_block_group(trans, inode); |
| 4292 | ret = btrfs_commit_transaction(trans, root); | 4334 | if (nolock) |
| 4335 | ret = btrfs_end_transaction_nolock(trans, root); | ||
| 4336 | else | ||
| 4337 | ret = btrfs_commit_transaction(trans, root); | ||
| 4293 | } | 4338 | } |
| 4294 | return ret; | 4339 | return ret; |
| 4295 | } | 4340 | } |
| @@ -5645,7 +5690,6 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
| 5645 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5690 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5646 | struct btrfs_dio_private *dip; | 5691 | struct btrfs_dio_private *dip; |
| 5647 | struct bio_vec *bvec = bio->bi_io_vec; | 5692 | struct bio_vec *bvec = bio->bi_io_vec; |
| 5648 | u64 start; | ||
| 5649 | int skip_sum; | 5693 | int skip_sum; |
| 5650 | int write = rw & REQ_WRITE; | 5694 | int write = rw & REQ_WRITE; |
| 5651 | int ret = 0; | 5695 | int ret = 0; |
| @@ -5671,7 +5715,6 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
| 5671 | dip->inode = inode; | 5715 | dip->inode = inode; |
| 5672 | dip->logical_offset = file_offset; | 5716 | dip->logical_offset = file_offset; |
| 5673 | 5717 | ||
| 5674 | start = dip->logical_offset; | ||
| 5675 | dip->bytes = 0; | 5718 | dip->bytes = 0; |
| 5676 | do { | 5719 | do { |
| 5677 | dip->bytes += bvec->bv_len; | 5720 | dip->bytes += bvec->bv_len; |
| @@ -6308,6 +6351,21 @@ void btrfs_destroy_inode(struct inode *inode) | |||
| 6308 | spin_unlock(&root->fs_info->ordered_extent_lock); | 6351 | spin_unlock(&root->fs_info->ordered_extent_lock); |
| 6309 | } | 6352 | } |
| 6310 | 6353 | ||
| 6354 | if (root == root->fs_info->tree_root) { | ||
| 6355 | struct btrfs_block_group_cache *block_group; | ||
| 6356 | |||
| 6357 | block_group = btrfs_lookup_block_group(root->fs_info, | ||
| 6358 | BTRFS_I(inode)->block_group); | ||
| 6359 | if (block_group && block_group->inode == inode) { | ||
| 6360 | spin_lock(&block_group->lock); | ||
| 6361 | block_group->inode = NULL; | ||
| 6362 | spin_unlock(&block_group->lock); | ||
| 6363 | btrfs_put_block_group(block_group); | ||
| 6364 | } else if (block_group) { | ||
| 6365 | btrfs_put_block_group(block_group); | ||
| 6366 | } | ||
| 6367 | } | ||
| 6368 | |||
| 6311 | spin_lock(&root->orphan_lock); | 6369 | spin_lock(&root->orphan_lock); |
| 6312 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { | 6370 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { |
| 6313 | printk(KERN_INFO "BTRFS: inode %lu still on the orphan list\n", | 6371 | printk(KERN_INFO "BTRFS: inode %lu still on the orphan list\n", |
| @@ -6340,7 +6398,8 @@ int btrfs_drop_inode(struct inode *inode) | |||
| 6340 | { | 6398 | { |
| 6341 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6399 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 6342 | 6400 | ||
| 6343 | if (btrfs_root_refs(&root->root_item) == 0) | 6401 | if (btrfs_root_refs(&root->root_item) == 0 && |
| 6402 | root != root->fs_info->tree_root) | ||
| 6344 | return 1; | 6403 | return 1; |
| 6345 | else | 6404 | else |
| 6346 | return generic_drop_inode(inode); | 6405 | return generic_drop_inode(inode); |
| @@ -6609,7 +6668,8 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
| 6609 | return 0; | 6668 | return 0; |
| 6610 | } | 6669 | } |
| 6611 | 6670 | ||
| 6612 | int btrfs_start_one_delalloc_inode(struct btrfs_root *root, int delay_iput) | 6671 | int btrfs_start_one_delalloc_inode(struct btrfs_root *root, int delay_iput, |
| 6672 | int sync) | ||
| 6613 | { | 6673 | { |
| 6614 | struct btrfs_inode *binode; | 6674 | struct btrfs_inode *binode; |
| 6615 | struct inode *inode = NULL; | 6675 | struct inode *inode = NULL; |
| @@ -6631,7 +6691,26 @@ int btrfs_start_one_delalloc_inode(struct btrfs_root *root, int delay_iput) | |||
| 6631 | spin_unlock(&root->fs_info->delalloc_lock); | 6691 | spin_unlock(&root->fs_info->delalloc_lock); |
| 6632 | 6692 | ||
| 6633 | if (inode) { | 6693 | if (inode) { |
| 6634 | write_inode_now(inode, 0); | 6694 | if (sync) { |
| 6695 | filemap_write_and_wait(inode->i_mapping); | ||
| 6696 | /* | ||
| 6697 | * We have to do this because compression doesn't | ||
| 6698 | * actually set PG_writeback until it submits the pages | ||
| 6699 | * for IO, which happens in an async thread, so we could | ||
| 6700 | * race and not actually wait for any writeback pages | ||
| 6701 | * because they've not been submitted yet. Technically | ||
| 6702 | * this could still be the case for the ordered stuff | ||
| 6703 | * since the async thread may not have started to do its | ||
| 6704 | * work yet. If this becomes the case then we need to | ||
| 6705 | * figure out a way to make sure that in writepage we | ||
| 6706 | * wait for any async pages to be submitted before | ||
| 6707 | * returning so that fdatawait does what its supposed to | ||
| 6708 | * do. | ||
| 6709 | */ | ||
| 6710 | btrfs_wait_ordered_range(inode, 0, (u64)-1); | ||
| 6711 | } else { | ||
| 6712 | filemap_flush(inode->i_mapping); | ||
| 6713 | } | ||
| 6635 | if (delay_iput) | 6714 | if (delay_iput) |
| 6636 | btrfs_add_delayed_iput(inode); | 6715 | btrfs_add_delayed_iput(inode); |
| 6637 | else | 6716 | else |
| @@ -6757,27 +6836,33 @@ out_unlock: | |||
| 6757 | return err; | 6836 | return err; |
| 6758 | } | 6837 | } |
| 6759 | 6838 | ||
| 6760 | int btrfs_prealloc_file_range(struct inode *inode, int mode, | 6839 | static int __btrfs_prealloc_file_range(struct inode *inode, int mode, |
| 6761 | u64 start, u64 num_bytes, u64 min_size, | 6840 | u64 start, u64 num_bytes, u64 min_size, |
| 6762 | loff_t actual_len, u64 *alloc_hint) | 6841 | loff_t actual_len, u64 *alloc_hint, |
| 6842 | struct btrfs_trans_handle *trans) | ||
| 6763 | { | 6843 | { |
| 6764 | struct btrfs_trans_handle *trans; | ||
| 6765 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6844 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 6766 | struct btrfs_key ins; | 6845 | struct btrfs_key ins; |
| 6767 | u64 cur_offset = start; | 6846 | u64 cur_offset = start; |
| 6768 | int ret = 0; | 6847 | int ret = 0; |
| 6848 | bool own_trans = true; | ||
| 6769 | 6849 | ||
| 6850 | if (trans) | ||
| 6851 | own_trans = false; | ||
| 6770 | while (num_bytes > 0) { | 6852 | while (num_bytes > 0) { |
| 6771 | trans = btrfs_start_transaction(root, 3); | 6853 | if (own_trans) { |
| 6772 | if (IS_ERR(trans)) { | 6854 | trans = btrfs_start_transaction(root, 3); |
| 6773 | ret = PTR_ERR(trans); | 6855 | if (IS_ERR(trans)) { |
| 6774 | break; | 6856 | ret = PTR_ERR(trans); |
| 6857 | break; | ||
| 6858 | } | ||
| 6775 | } | 6859 | } |
| 6776 | 6860 | ||
| 6777 | ret = btrfs_reserve_extent(trans, root, num_bytes, min_size, | 6861 | ret = btrfs_reserve_extent(trans, root, num_bytes, min_size, |
| 6778 | 0, *alloc_hint, (u64)-1, &ins, 1); | 6862 | 0, *alloc_hint, (u64)-1, &ins, 1); |
| 6779 | if (ret) { | 6863 | if (ret) { |
| 6780 | btrfs_end_transaction(trans, root); | 6864 | if (own_trans) |
| 6865 | btrfs_end_transaction(trans, root); | ||
| 6781 | break; | 6866 | break; |
| 6782 | } | 6867 | } |
| 6783 | 6868 | ||
| @@ -6810,11 +6895,30 @@ int btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
| 6810 | ret = btrfs_update_inode(trans, root, inode); | 6895 | ret = btrfs_update_inode(trans, root, inode); |
| 6811 | BUG_ON(ret); | 6896 | BUG_ON(ret); |
| 6812 | 6897 | ||
| 6813 | btrfs_end_transaction(trans, root); | 6898 | if (own_trans) |
| 6899 | btrfs_end_transaction(trans, root); | ||
| 6814 | } | 6900 | } |
| 6815 | return ret; | 6901 | return ret; |
| 6816 | } | 6902 | } |
| 6817 | 6903 | ||
| 6904 | int btrfs_prealloc_file_range(struct inode *inode, int mode, | ||
| 6905 | u64 start, u64 num_bytes, u64 min_size, | ||
| 6906 | loff_t actual_len, u64 *alloc_hint) | ||
| 6907 | { | ||
| 6908 | return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, | ||
| 6909 | min_size, actual_len, alloc_hint, | ||
| 6910 | NULL); | ||
| 6911 | } | ||
| 6912 | |||
| 6913 | int btrfs_prealloc_file_range_trans(struct inode *inode, | ||
| 6914 | struct btrfs_trans_handle *trans, int mode, | ||
| 6915 | u64 start, u64 num_bytes, u64 min_size, | ||
| 6916 | loff_t actual_len, u64 *alloc_hint) | ||
| 6917 | { | ||
| 6918 | return __btrfs_prealloc_file_range(inode, mode, start, num_bytes, | ||
| 6919 | min_size, actual_len, alloc_hint, trans); | ||
| 6920 | } | ||
| 6921 | |||
| 6818 | static long btrfs_fallocate(struct inode *inode, int mode, | 6922 | static long btrfs_fallocate(struct inode *inode, int mode, |
| 6819 | loff_t offset, loff_t len) | 6923 | loff_t offset, loff_t len) |
| 6820 | { | 6924 | { |
