aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/transaction.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-01-03 09:08:48 -0500
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:03:58 -0400
commit4313b3994d719fcdeb7e661473019ca3d62e829b (patch)
tree1a18dca96a9f54e8444c4c06c9beda3694bc25d3 /fs/btrfs/transaction.c
parent56b453c92fdf51fd3283a2dc2dfbedf36f516031 (diff)
Btrfs: Reduce stack usage in the resizer, fix 32 bit compiles
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/transaction.c')
-rw-r--r--fs/btrfs/transaction.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index 1ad611b9f61b..02721eea9a7a 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -481,12 +481,10 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
481 struct btrfs_transaction *cur_trans; 481 struct btrfs_transaction *cur_trans;
482 struct btrfs_transaction *prev_trans = NULL; 482 struct btrfs_transaction *prev_trans = NULL;
483 struct list_head dirty_fs_roots; 483 struct list_head dirty_fs_roots;
484 struct extent_map_tree pinned_copy; 484 struct extent_map_tree *pinned_copy;
485 DEFINE_WAIT(wait); 485 DEFINE_WAIT(wait);
486 int ret; 486 int ret;
487 487
488 extent_map_tree_init(&pinned_copy,
489 root->fs_info->btree_inode->i_mapping, GFP_NOFS);
490 INIT_LIST_HEAD(&dirty_fs_roots); 488 INIT_LIST_HEAD(&dirty_fs_roots);
491 489
492 mutex_lock(&root->fs_info->trans_mutex); 490 mutex_lock(&root->fs_info->trans_mutex);
@@ -507,6 +505,14 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
507 mutex_lock(&root->fs_info->fs_mutex); 505 mutex_lock(&root->fs_info->fs_mutex);
508 return 0; 506 return 0;
509 } 507 }
508
509 pinned_copy = kmalloc(sizeof(*pinned_copy), GFP_NOFS);
510 if (!pinned_copy)
511 return -ENOMEM;
512
513 extent_map_tree_init(pinned_copy,
514 root->fs_info->btree_inode->i_mapping, GFP_NOFS);
515
510 trans->transaction->in_commit = 1; 516 trans->transaction->in_commit = 1;
511 cur_trans = trans->transaction; 517 cur_trans = trans->transaction;
512 if (cur_trans->list.prev != &root->fs_info->trans_list) { 518 if (cur_trans->list.prev != &root->fs_info->trans_list) {
@@ -568,16 +574,20 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
568 &root->fs_info->super_copy, 0, 574 &root->fs_info->super_copy, 0,
569 sizeof(root->fs_info->super_copy)); 575 sizeof(root->fs_info->super_copy));
570 576
571 btrfs_copy_pinned(root, &pinned_copy); 577 btrfs_copy_pinned(root, pinned_copy);
572 578
573 mutex_unlock(&root->fs_info->trans_mutex); 579 mutex_unlock(&root->fs_info->trans_mutex);
574 mutex_unlock(&root->fs_info->fs_mutex); 580 mutex_unlock(&root->fs_info->fs_mutex);
575 ret = btrfs_write_and_wait_transaction(trans, root); 581 ret = btrfs_write_and_wait_transaction(trans, root);
576 BUG_ON(ret); 582 BUG_ON(ret);
577 write_ctree_super(trans, root); 583 write_ctree_super(trans, root);
584
578 mutex_lock(&root->fs_info->fs_mutex); 585 mutex_lock(&root->fs_info->fs_mutex);
579 btrfs_finish_extent_commit(trans, root, &pinned_copy); 586 btrfs_finish_extent_commit(trans, root, pinned_copy);
580 mutex_lock(&root->fs_info->trans_mutex); 587 mutex_lock(&root->fs_info->trans_mutex);
588
589 kfree(pinned_copy);
590
581 cur_trans->commit_done = 1; 591 cur_trans->commit_done = 1;
582 root->fs_info->last_trans_committed = cur_trans->transid; 592 root->fs_info->last_trans_committed = cur_trans->transid;
583 wake_up(&cur_trans->commit_wait); 593 wake_up(&cur_trans->commit_wait);