diff options
Diffstat (limited to 'fs/btrfs/delayed-inode.c')
-rw-r--r-- | fs/btrfs/delayed-inode.c | 110 |
1 files changed, 93 insertions, 17 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index b52c672f4c18..5b163572e0ca 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -591,7 +591,7 @@ static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans, | |||
591 | return 0; | 591 | return 0; |
592 | 592 | ||
593 | src_rsv = trans->block_rsv; | 593 | src_rsv = trans->block_rsv; |
594 | dst_rsv = &root->fs_info->global_block_rsv; | 594 | dst_rsv = &root->fs_info->delayed_block_rsv; |
595 | 595 | ||
596 | num_bytes = btrfs_calc_trans_metadata_size(root, 1); | 596 | num_bytes = btrfs_calc_trans_metadata_size(root, 1); |
597 | ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes); | 597 | ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes); |
@@ -609,7 +609,7 @@ static void btrfs_delayed_item_release_metadata(struct btrfs_root *root, | |||
609 | if (!item->bytes_reserved) | 609 | if (!item->bytes_reserved) |
610 | return; | 610 | return; |
611 | 611 | ||
612 | rsv = &root->fs_info->global_block_rsv; | 612 | rsv = &root->fs_info->delayed_block_rsv; |
613 | btrfs_block_rsv_release(root, rsv, | 613 | btrfs_block_rsv_release(root, rsv, |
614 | item->bytes_reserved); | 614 | item->bytes_reserved); |
615 | } | 615 | } |
@@ -617,24 +617,102 @@ static void btrfs_delayed_item_release_metadata(struct btrfs_root *root, | |||
617 | static int btrfs_delayed_inode_reserve_metadata( | 617 | static int btrfs_delayed_inode_reserve_metadata( |
618 | struct btrfs_trans_handle *trans, | 618 | struct btrfs_trans_handle *trans, |
619 | struct btrfs_root *root, | 619 | struct btrfs_root *root, |
620 | struct inode *inode, | ||
620 | struct btrfs_delayed_node *node) | 621 | struct btrfs_delayed_node *node) |
621 | { | 622 | { |
622 | struct btrfs_block_rsv *src_rsv; | 623 | struct btrfs_block_rsv *src_rsv; |
623 | struct btrfs_block_rsv *dst_rsv; | 624 | struct btrfs_block_rsv *dst_rsv; |
624 | u64 num_bytes; | 625 | u64 num_bytes; |
625 | int ret; | 626 | int ret; |
626 | 627 | int release = false; | |
627 | if (!trans->bytes_reserved) | ||
628 | return 0; | ||
629 | 628 | ||
630 | src_rsv = trans->block_rsv; | 629 | src_rsv = trans->block_rsv; |
631 | dst_rsv = &root->fs_info->global_block_rsv; | 630 | dst_rsv = &root->fs_info->delayed_block_rsv; |
632 | 631 | ||
633 | num_bytes = btrfs_calc_trans_metadata_size(root, 1); | 632 | num_bytes = btrfs_calc_trans_metadata_size(root, 1); |
633 | |||
634 | /* | ||
635 | * btrfs_dirty_inode will update the inode under btrfs_join_transaction | ||
636 | * which doesn't reserve space for speed. This is a problem since we | ||
637 | * still need to reserve space for this update, so try to reserve the | ||
638 | * space. | ||
639 | * | ||
640 | * Now if src_rsv == delalloc_block_rsv we'll let it just steal since | ||
641 | * we're accounted for. | ||
642 | */ | ||
643 | if (!trans->bytes_reserved && | ||
644 | src_rsv != &root->fs_info->delalloc_block_rsv) { | ||
645 | ret = btrfs_block_rsv_add_noflush(root, dst_rsv, num_bytes); | ||
646 | /* | ||
647 | * Since we're under a transaction reserve_metadata_bytes could | ||
648 | * try to commit the transaction which will make it return | ||
649 | * EAGAIN to make us stop the transaction we have, so return | ||
650 | * ENOSPC instead so that btrfs_dirty_inode knows what to do. | ||
651 | */ | ||
652 | if (ret == -EAGAIN) | ||
653 | ret = -ENOSPC; | ||
654 | if (!ret) | ||
655 | node->bytes_reserved = num_bytes; | ||
656 | return ret; | ||
657 | } else if (src_rsv == &root->fs_info->delalloc_block_rsv) { | ||
658 | spin_lock(&BTRFS_I(inode)->lock); | ||
659 | if (BTRFS_I(inode)->delalloc_meta_reserved) { | ||
660 | BTRFS_I(inode)->delalloc_meta_reserved = 0; | ||
661 | spin_unlock(&BTRFS_I(inode)->lock); | ||
662 | release = true; | ||
663 | goto migrate; | ||
664 | } | ||
665 | spin_unlock(&BTRFS_I(inode)->lock); | ||
666 | |||
667 | /* Ok we didn't have space pre-reserved. This shouldn't happen | ||
668 | * too often but it can happen if we do delalloc to an existing | ||
669 | * inode which gets dirtied because of the time update, and then | ||
670 | * isn't touched again until after the transaction commits and | ||
671 | * then we try to write out the data. First try to be nice and | ||
672 | * reserve something strictly for us. If not be a pain and try | ||
673 | * to steal from the delalloc block rsv. | ||
674 | */ | ||
675 | ret = btrfs_block_rsv_add_noflush(root, dst_rsv, num_bytes); | ||
676 | if (!ret) | ||
677 | goto out; | ||
678 | |||
679 | ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes); | ||
680 | if (!ret) | ||
681 | goto out; | ||
682 | |||
683 | /* | ||
684 | * Ok this is a problem, let's just steal from the global rsv | ||
685 | * since this really shouldn't happen that often. | ||
686 | */ | ||
687 | WARN_ON(1); | ||
688 | ret = btrfs_block_rsv_migrate(&root->fs_info->global_block_rsv, | ||
689 | dst_rsv, num_bytes); | ||
690 | goto out; | ||
691 | } | ||
692 | |||
693 | migrate: | ||
634 | ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes); | 694 | ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes); |
695 | |||
696 | out: | ||
697 | /* | ||
698 | * Migrate only takes a reservation, it doesn't touch the size of the | ||
699 | * block_rsv. This is to simplify people who don't normally have things | ||
700 | * migrated from their block rsv. If they go to release their | ||
701 | * reservation, that will decrease the size as well, so if migrate | ||
702 | * reduced size we'd end up with a negative size. But for the | ||
703 | * delalloc_meta_reserved stuff we will only know to drop 1 reservation, | ||
704 | * but we could in fact do this reserve/migrate dance several times | ||
705 | * between the time we did the original reservation and we'd clean it | ||
706 | * up. So to take care of this, release the space for the meta | ||
707 | * reservation here. I think it may be time for a documentation page on | ||
708 | * how block rsvs. work. | ||
709 | */ | ||
635 | if (!ret) | 710 | if (!ret) |
636 | node->bytes_reserved = num_bytes; | 711 | node->bytes_reserved = num_bytes; |
637 | 712 | ||
713 | if (release) | ||
714 | btrfs_block_rsv_release(root, src_rsv, num_bytes); | ||
715 | |||
638 | return ret; | 716 | return ret; |
639 | } | 717 | } |
640 | 718 | ||
@@ -646,7 +724,7 @@ static void btrfs_delayed_inode_release_metadata(struct btrfs_root *root, | |||
646 | if (!node->bytes_reserved) | 724 | if (!node->bytes_reserved) |
647 | return; | 725 | return; |
648 | 726 | ||
649 | rsv = &root->fs_info->global_block_rsv; | 727 | rsv = &root->fs_info->delayed_block_rsv; |
650 | btrfs_block_rsv_release(root, rsv, | 728 | btrfs_block_rsv_release(root, rsv, |
651 | node->bytes_reserved); | 729 | node->bytes_reserved); |
652 | node->bytes_reserved = 0; | 730 | node->bytes_reserved = 0; |
@@ -1026,7 +1104,7 @@ int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | |||
1026 | path->leave_spinning = 1; | 1104 | path->leave_spinning = 1; |
1027 | 1105 | ||
1028 | block_rsv = trans->block_rsv; | 1106 | block_rsv = trans->block_rsv; |
1029 | trans->block_rsv = &root->fs_info->global_block_rsv; | 1107 | trans->block_rsv = &root->fs_info->delayed_block_rsv; |
1030 | 1108 | ||
1031 | delayed_root = btrfs_get_delayed_root(root); | 1109 | delayed_root = btrfs_get_delayed_root(root); |
1032 | 1110 | ||
@@ -1069,7 +1147,7 @@ static int __btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans, | |||
1069 | path->leave_spinning = 1; | 1147 | path->leave_spinning = 1; |
1070 | 1148 | ||
1071 | block_rsv = trans->block_rsv; | 1149 | block_rsv = trans->block_rsv; |
1072 | trans->block_rsv = &node->root->fs_info->global_block_rsv; | 1150 | trans->block_rsv = &node->root->fs_info->delayed_block_rsv; |
1073 | 1151 | ||
1074 | ret = btrfs_insert_delayed_items(trans, path, node->root, node); | 1152 | ret = btrfs_insert_delayed_items(trans, path, node->root, node); |
1075 | if (!ret) | 1153 | if (!ret) |
@@ -1149,7 +1227,7 @@ static void btrfs_async_run_delayed_node_done(struct btrfs_work *work) | |||
1149 | goto free_path; | 1227 | goto free_path; |
1150 | 1228 | ||
1151 | block_rsv = trans->block_rsv; | 1229 | block_rsv = trans->block_rsv; |
1152 | trans->block_rsv = &root->fs_info->global_block_rsv; | 1230 | trans->block_rsv = &root->fs_info->delayed_block_rsv; |
1153 | 1231 | ||
1154 | ret = btrfs_insert_delayed_items(trans, path, root, delayed_node); | 1232 | ret = btrfs_insert_delayed_items(trans, path, root, delayed_node); |
1155 | if (!ret) | 1233 | if (!ret) |
@@ -1641,7 +1719,7 @@ int btrfs_fill_inode(struct inode *inode, u32 *rdev) | |||
1641 | inode->i_gid = btrfs_stack_inode_gid(inode_item); | 1719 | inode->i_gid = btrfs_stack_inode_gid(inode_item); |
1642 | btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item)); | 1720 | btrfs_i_size_write(inode, btrfs_stack_inode_size(inode_item)); |
1643 | inode->i_mode = btrfs_stack_inode_mode(inode_item); | 1721 | inode->i_mode = btrfs_stack_inode_mode(inode_item); |
1644 | inode->i_nlink = btrfs_stack_inode_nlink(inode_item); | 1722 | set_nlink(inode, btrfs_stack_inode_nlink(inode_item)); |
1645 | inode_set_bytes(inode, btrfs_stack_inode_nbytes(inode_item)); | 1723 | inode_set_bytes(inode, btrfs_stack_inode_nbytes(inode_item)); |
1646 | BTRFS_I(inode)->generation = btrfs_stack_inode_generation(inode_item); | 1724 | BTRFS_I(inode)->generation = btrfs_stack_inode_generation(inode_item); |
1647 | BTRFS_I(inode)->sequence = btrfs_stack_inode_sequence(inode_item); | 1725 | BTRFS_I(inode)->sequence = btrfs_stack_inode_sequence(inode_item); |
@@ -1685,12 +1763,10 @@ int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans, | |||
1685 | goto release_node; | 1763 | goto release_node; |
1686 | } | 1764 | } |
1687 | 1765 | ||
1688 | ret = btrfs_delayed_inode_reserve_metadata(trans, root, delayed_node); | 1766 | ret = btrfs_delayed_inode_reserve_metadata(trans, root, inode, |
1689 | /* | 1767 | delayed_node); |
1690 | * we must reserve enough space when we start a new transaction, | 1768 | if (ret) |
1691 | * so reserving metadata failure is impossible | 1769 | goto release_node; |
1692 | */ | ||
1693 | BUG_ON(ret); | ||
1694 | 1770 | ||
1695 | fill_stack_inode_item(trans, &delayed_node->inode_item, inode); | 1771 | fill_stack_inode_item(trans, &delayed_node->inode_item, inode); |
1696 | delayed_node->inode_dirty = 1; | 1772 | delayed_node->inode_dirty = 1; |