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 64f99cf69ce..558cac2dfa5 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 | { |