diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-01-03 09:08:48 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:03:58 -0400 |
commit | 4313b3994d719fcdeb7e661473019ca3d62e829b (patch) | |
tree | 1a18dca96a9f54e8444c4c06c9beda3694bc25d3 /fs/btrfs/transaction.c | |
parent | 56b453c92fdf51fd3283a2dc2dfbedf36f516031 (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.c | 20 |
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); |