aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2010-07-02 12:14:14 -0400
committerChris Mason <chris.mason@oracle.com>2010-10-29 09:26:29 -0400
commit0cb59c9953171e9adf6da8142a5c85ceb77bb60d (patch)
treef72af47fa18815491814290a1b4907082bd9316d /fs/btrfs/inode.c
parent0af3d00bad38d3bb9912a60928ad0669f17bdb76 (diff)
Btrfs: write out free space cache
This is a simple bit, just dump the free space cache out to our preallocated inode when we're writing out dirty block groups. There are a bunch of changes in inode.c in order to account for special cases. Mostly when we're doing the writeout we're holding trans_mutex, so we need to use the nolock transacation functions. Also we can't do asynchronous completions since the async thread could be blocked on already completed IO waiting for the transaction lock. This has been tested with xfstests and btrfs filesystem balance, as well as my ENOSPC tests. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c60
1 files changed, 48 insertions, 12 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 1af1ea88e8a..f2fb974ed8f 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -764,6 +764,7 @@ static noinline int cow_file_range(struct inode *inode,
764 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; 764 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
765 int ret = 0; 765 int ret = 0;
766 766
767 BUG_ON(root == root->fs_info->tree_root);
767 trans = btrfs_join_transaction(root, 1); 768 trans = btrfs_join_transaction(root, 1);
768 BUG_ON(!trans); 769 BUG_ON(!trans);
769 btrfs_set_trans_block_group(trans, inode); 770 btrfs_set_trans_block_group(trans, inode);
@@ -1035,10 +1036,16 @@ static noinline int run_delalloc_nocow(struct inode *inode,
1035 int type; 1036 int type;
1036 int nocow; 1037 int nocow;
1037 int check_prev = 1; 1038 int check_prev = 1;
1039 bool nolock = false;
1038 1040
1039 path = btrfs_alloc_path(); 1041 path = btrfs_alloc_path();
1040 BUG_ON(!path); 1042 BUG_ON(!path);
1041 trans = btrfs_join_transaction(root, 1); 1043 if (root == root->fs_info->tree_root) {
1044 nolock = true;
1045 trans = btrfs_join_transaction_nolock(root, 1);
1046 } else {
1047 trans = btrfs_join_transaction(root, 1);
1048 }
1042 BUG_ON(!trans); 1049 BUG_ON(!trans);
1043 1050
1044 cow_start = (u64)-1; 1051 cow_start = (u64)-1;
@@ -1211,8 +1218,13 @@ out_check:
1211 BUG_ON(ret); 1218 BUG_ON(ret);
1212 } 1219 }
1213 1220
1214 ret = btrfs_end_transaction(trans, root); 1221 if (nolock) {
1215 BUG_ON(ret); 1222 ret = btrfs_end_transaction_nolock(trans, root);
1223 BUG_ON(ret);
1224 } else {
1225 ret = btrfs_end_transaction(trans, root);
1226 BUG_ON(ret);
1227 }
1216 btrfs_free_path(path); 1228 btrfs_free_path(path);
1217 return 0; 1229 return 0;
1218} 1230}
@@ -1289,6 +1301,8 @@ static int btrfs_set_bit_hook(struct inode *inode,
1289 if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { 1301 if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
1290 struct btrfs_root *root = BTRFS_I(inode)->root; 1302 struct btrfs_root *root = BTRFS_I(inode)->root;
1291 u64 len = state->end + 1 - state->start; 1303 u64 len = state->end + 1 - state->start;
1304 int do_list = (root->root_key.objectid !=
1305 BTRFS_ROOT_TREE_OBJECTID);
1292 1306
1293 if (*bits & EXTENT_FIRST_DELALLOC) 1307 if (*bits & EXTENT_FIRST_DELALLOC)
1294 *bits &= ~EXTENT_FIRST_DELALLOC; 1308 *bits &= ~EXTENT_FIRST_DELALLOC;
@@ -1298,7 +1312,7 @@ static int btrfs_set_bit_hook(struct inode *inode,
1298 spin_lock(&root->fs_info->delalloc_lock); 1312 spin_lock(&root->fs_info->delalloc_lock);
1299 BTRFS_I(inode)->delalloc_bytes += len; 1313 BTRFS_I(inode)->delalloc_bytes += len;
1300 root->fs_info->delalloc_bytes += len; 1314 root->fs_info->delalloc_bytes += len;
1301 if (list_empty(&BTRFS_I(inode)->delalloc_inodes)) { 1315 if (do_list && list_empty(&BTRFS_I(inode)->delalloc_inodes)) {
1302 list_add_tail(&BTRFS_I(inode)->delalloc_inodes, 1316 list_add_tail(&BTRFS_I(inode)->delalloc_inodes,
1303 &root->fs_info->delalloc_inodes); 1317 &root->fs_info->delalloc_inodes);
1304 } 1318 }
@@ -1321,6 +1335,8 @@ static int btrfs_clear_bit_hook(struct inode *inode,
1321 if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) { 1335 if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
1322 struct btrfs_root *root = BTRFS_I(inode)->root; 1336 struct btrfs_root *root = BTRFS_I(inode)->root;
1323 u64 len = state->end + 1 - state->start; 1337 u64 len = state->end + 1 - state->start;
1338 int do_list = (root->root_key.objectid !=
1339 BTRFS_ROOT_TREE_OBJECTID);
1324 1340
1325 if (*bits & EXTENT_FIRST_DELALLOC) 1341 if (*bits & EXTENT_FIRST_DELALLOC)
1326 *bits &= ~EXTENT_FIRST_DELALLOC; 1342 *bits &= ~EXTENT_FIRST_DELALLOC;
@@ -1330,14 +1346,15 @@ static int btrfs_clear_bit_hook(struct inode *inode,
1330 if (*bits & EXTENT_DO_ACCOUNTING) 1346 if (*bits & EXTENT_DO_ACCOUNTING)
1331 btrfs_delalloc_release_metadata(inode, len); 1347 btrfs_delalloc_release_metadata(inode, len);
1332 1348
1333 if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) 1349 if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID
1350 && do_list)
1334 btrfs_free_reserved_data_space(inode, len); 1351 btrfs_free_reserved_data_space(inode, len);
1335 1352
1336 spin_lock(&root->fs_info->delalloc_lock); 1353 spin_lock(&root->fs_info->delalloc_lock);
1337 root->fs_info->delalloc_bytes -= len; 1354 root->fs_info->delalloc_bytes -= len;
1338 BTRFS_I(inode)->delalloc_bytes -= len; 1355 BTRFS_I(inode)->delalloc_bytes -= len;
1339 1356
1340 if (BTRFS_I(inode)->delalloc_bytes == 0 && 1357 if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 &&
1341 !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { 1358 !list_empty(&BTRFS_I(inode)->delalloc_inodes)) {
1342 list_del_init(&BTRFS_I(inode)->delalloc_inodes); 1359 list_del_init(&BTRFS_I(inode)->delalloc_inodes);
1343 } 1360 }
@@ -1426,7 +1443,10 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
1426 1443
1427 skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; 1444 skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
1428 1445
1429 ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); 1446 if (root == root->fs_info->tree_root)
1447 ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2);
1448 else
1449 ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0);
1430 BUG_ON(ret); 1450 BUG_ON(ret);
1431 1451
1432 if (!(rw & REQ_WRITE)) { 1452 if (!(rw & REQ_WRITE)) {
@@ -1662,6 +1682,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1662 struct extent_state *cached_state = NULL; 1682 struct extent_state *cached_state = NULL;
1663 int compressed = 0; 1683 int compressed = 0;
1664 int ret; 1684 int ret;
1685 bool nolock = false;
1665 1686
1666 ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, 1687 ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start,
1667 end - start + 1); 1688 end - start + 1);
@@ -1669,11 +1690,17 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1669 return 0; 1690 return 0;
1670 BUG_ON(!ordered_extent); 1691 BUG_ON(!ordered_extent);
1671 1692
1693 nolock = (root == root->fs_info->tree_root);
1694
1672 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { 1695 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) {
1673 BUG_ON(!list_empty(&ordered_extent->list)); 1696 BUG_ON(!list_empty(&ordered_extent->list));
1674 ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); 1697 ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent);
1675 if (!ret) { 1698 if (!ret) {
1676 trans = btrfs_join_transaction(root, 1); 1699 if (nolock)
1700 trans = btrfs_join_transaction_nolock(root, 1);
1701 else
1702 trans = btrfs_join_transaction(root, 1);
1703 BUG_ON(!trans);
1677 btrfs_set_trans_block_group(trans, inode); 1704 btrfs_set_trans_block_group(trans, inode);
1678 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1705 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
1679 ret = btrfs_update_inode(trans, root, inode); 1706 ret = btrfs_update_inode(trans, root, inode);
@@ -1686,7 +1713,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1686 ordered_extent->file_offset + ordered_extent->len - 1, 1713 ordered_extent->file_offset + ordered_extent->len - 1,
1687 0, &cached_state, GFP_NOFS); 1714 0, &cached_state, GFP_NOFS);
1688 1715
1689 trans = btrfs_join_transaction(root, 1); 1716 if (nolock)
1717 trans = btrfs_join_transaction_nolock(root, 1);
1718 else
1719 trans = btrfs_join_transaction(root, 1);
1690 btrfs_set_trans_block_group(trans, inode); 1720 btrfs_set_trans_block_group(trans, inode);
1691 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1721 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
1692 1722
@@ -1725,9 +1755,15 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1725 ret = btrfs_update_inode(trans, root, inode); 1755 ret = btrfs_update_inode(trans, root, inode);
1726 BUG_ON(ret); 1756 BUG_ON(ret);
1727out: 1757out:
1728 btrfs_delalloc_release_metadata(inode, ordered_extent->len); 1758 if (nolock) {
1729 if (trans) 1759 if (trans)
1730 btrfs_end_transaction(trans, root); 1760 btrfs_end_transaction_nolock(trans, root);
1761 } else {
1762 btrfs_delalloc_release_metadata(inode, ordered_extent->len);
1763 if (trans)
1764 btrfs_end_transaction(trans, root);
1765 }
1766
1731 /* once for us */ 1767 /* once for us */
1732 btrfs_put_ordered_extent(ordered_extent); 1768 btrfs_put_ordered_extent(ordered_extent);
1733 /* once for the tree */ 1769 /* once for the tree */