diff options
-rw-r--r-- | fs/btrfs/ctree.h | 12 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 109 | ||||
-rw-r--r-- | fs/btrfs/file.c | 15 | ||||
-rw-r--r-- | fs/btrfs/inode-map.c | 6 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 34 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 6 | ||||
-rw-r--r-- | fs/btrfs/qgroup.c | 18 | ||||
-rw-r--r-- | fs/btrfs/qgroup.h | 8 | ||||
-rw-r--r-- | fs/btrfs/relocation.c | 8 |
9 files changed, 60 insertions, 156 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 0f1ade133111..0d0f5d2a534a 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -3452,11 +3452,9 @@ enum btrfs_reserve_flush_enum { | |||
3452 | BTRFS_RESERVE_FLUSH_ALL, | 3452 | BTRFS_RESERVE_FLUSH_ALL, |
3453 | }; | 3453 | }; |
3454 | 3454 | ||
3455 | int btrfs_check_data_free_space(struct inode *inode, u64 bytes, u64 write_bytes); | 3455 | int btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len); |
3456 | int __btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len); | ||
3457 | int btrfs_alloc_data_chunk_ondemand(struct inode *inode, u64 bytes); | 3456 | int btrfs_alloc_data_chunk_ondemand(struct inode *inode, u64 bytes); |
3458 | void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes); | 3457 | void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len); |
3459 | void __btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len); | ||
3460 | void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans, | 3458 | void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans, |
3461 | struct btrfs_root *root); | 3459 | struct btrfs_root *root); |
3462 | void btrfs_trans_release_chunk_metadata(struct btrfs_trans_handle *trans); | 3460 | void btrfs_trans_release_chunk_metadata(struct btrfs_trans_handle *trans); |
@@ -3472,10 +3470,8 @@ void btrfs_subvolume_release_metadata(struct btrfs_root *root, | |||
3472 | u64 qgroup_reserved); | 3470 | u64 qgroup_reserved); |
3473 | int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes); | 3471 | int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes); |
3474 | void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes); | 3472 | void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes); |
3475 | int btrfs_delalloc_reserve_space(struct inode *inode, u64 num_bytes); | 3473 | int btrfs_delalloc_reserve_space(struct inode *inode, u64 start, u64 len); |
3476 | int __btrfs_delalloc_reserve_space(struct inode *inode, u64 start, u64 len); | 3474 | void btrfs_delalloc_release_space(struct inode *inode, u64 start, u64 len); |
3477 | void btrfs_delalloc_release_space(struct inode *inode, u64 num_bytes); | ||
3478 | void __btrfs_delalloc_release_space(struct inode *inode, u64 start, u64 len); | ||
3479 | void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type); | 3475 | void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type); |
3480 | struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root, | 3476 | struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root, |
3481 | unsigned short type); | 3477 | unsigned short type); |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 8c8d8b386cad..3a23225e83f4 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3356,7 +3356,7 @@ again: | |||
3356 | num_pages *= 16; | 3356 | num_pages *= 16; |
3357 | num_pages *= PAGE_CACHE_SIZE; | 3357 | num_pages *= PAGE_CACHE_SIZE; |
3358 | 3358 | ||
3359 | ret = __btrfs_check_data_free_space(inode, 0, num_pages); | 3359 | ret = btrfs_check_data_free_space(inode, 0, num_pages); |
3360 | if (ret) | 3360 | if (ret) |
3361 | goto out_put; | 3361 | goto out_put; |
3362 | 3362 | ||
@@ -3365,7 +3365,7 @@ again: | |||
3365 | &alloc_hint); | 3365 | &alloc_hint); |
3366 | if (!ret) | 3366 | if (!ret) |
3367 | dcs = BTRFS_DC_SETUP; | 3367 | dcs = BTRFS_DC_SETUP; |
3368 | __btrfs_free_reserved_data_space(inode, 0, num_pages); | 3368 | btrfs_free_reserved_data_space(inode, 0, num_pages); |
3369 | 3369 | ||
3370 | out_put: | 3370 | out_put: |
3371 | iput(inode); | 3371 | iput(inode); |
@@ -4034,27 +4034,11 @@ commit_trans: | |||
4034 | } | 4034 | } |
4035 | 4035 | ||
4036 | /* | 4036 | /* |
4037 | * This will check the space that the inode allocates from to make sure we have | ||
4038 | * enough space for bytes. | ||
4039 | */ | ||
4040 | int btrfs_check_data_free_space(struct inode *inode, u64 bytes, u64 write_bytes) | ||
4041 | { | ||
4042 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
4043 | int ret; | ||
4044 | |||
4045 | ret = btrfs_alloc_data_chunk_ondemand(inode, bytes); | ||
4046 | if (ret < 0) | ||
4047 | return ret; | ||
4048 | ret = btrfs_qgroup_reserve(root, write_bytes); | ||
4049 | return ret; | ||
4050 | } | ||
4051 | |||
4052 | /* | ||
4053 | * New check_data_free_space() with ability for precious data reservation | 4037 | * New check_data_free_space() with ability for precious data reservation |
4054 | * Will replace old btrfs_check_data_free_space(), but for patch split, | 4038 | * Will replace old btrfs_check_data_free_space(), but for patch split, |
4055 | * add a new function first and then replace it. | 4039 | * add a new function first and then replace it. |
4056 | */ | 4040 | */ |
4057 | int __btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len) | 4041 | int btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len) |
4058 | { | 4042 | { |
4059 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4043 | struct btrfs_root *root = BTRFS_I(inode)->root; |
4060 | int ret; | 4044 | int ret; |
@@ -4074,33 +4058,13 @@ int __btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len) | |||
4074 | } | 4058 | } |
4075 | 4059 | ||
4076 | /* | 4060 | /* |
4077 | * Called if we need to clear a data reservation for this inode. | ||
4078 | */ | ||
4079 | void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes) | ||
4080 | { | ||
4081 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
4082 | struct btrfs_space_info *data_sinfo; | ||
4083 | |||
4084 | /* make sure bytes are sectorsize aligned */ | ||
4085 | bytes = ALIGN(bytes, root->sectorsize); | ||
4086 | |||
4087 | data_sinfo = root->fs_info->data_sinfo; | ||
4088 | spin_lock(&data_sinfo->lock); | ||
4089 | WARN_ON(data_sinfo->bytes_may_use < bytes); | ||
4090 | data_sinfo->bytes_may_use -= bytes; | ||
4091 | trace_btrfs_space_reservation(root->fs_info, "space_info", | ||
4092 | data_sinfo->flags, bytes, 0); | ||
4093 | spin_unlock(&data_sinfo->lock); | ||
4094 | } | ||
4095 | |||
4096 | /* | ||
4097 | * Called if we need to clear a data reservation for this inode | 4061 | * Called if we need to clear a data reservation for this inode |
4098 | * Normally in a error case. | 4062 | * Normally in a error case. |
4099 | * | 4063 | * |
4100 | * This one will handle the per-indoe data rsv map for accurate reserved | 4064 | * This one will handle the per-indoe data rsv map for accurate reserved |
4101 | * space framework. | 4065 | * space framework. |
4102 | */ | 4066 | */ |
4103 | void __btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len) | 4067 | void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len) |
4104 | { | 4068 | { |
4105 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4069 | struct btrfs_root *root = BTRFS_I(inode)->root; |
4106 | struct btrfs_space_info *data_sinfo; | 4070 | struct btrfs_space_info *data_sinfo; |
@@ -5715,7 +5679,7 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes) | |||
5715 | } | 5679 | } |
5716 | 5680 | ||
5717 | /** | 5681 | /** |
5718 | * __btrfs_delalloc_reserve_space - reserve data and metadata space for | 5682 | * btrfs_delalloc_reserve_space - reserve data and metadata space for |
5719 | * delalloc | 5683 | * delalloc |
5720 | * @inode: inode we're writing to | 5684 | * @inode: inode we're writing to |
5721 | * @start: start range we are writing to | 5685 | * @start: start range we are writing to |
@@ -5739,53 +5703,21 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes) | |||
5739 | * Return 0 for success | 5703 | * Return 0 for success |
5740 | * Return <0 for error(-ENOSPC or -EQUOT) | 5704 | * Return <0 for error(-ENOSPC or -EQUOT) |
5741 | */ | 5705 | */ |
5742 | int __btrfs_delalloc_reserve_space(struct inode *inode, u64 start, u64 len) | 5706 | int btrfs_delalloc_reserve_space(struct inode *inode, u64 start, u64 len) |
5743 | { | 5707 | { |
5744 | int ret; | 5708 | int ret; |
5745 | 5709 | ||
5746 | ret = __btrfs_check_data_free_space(inode, start, len); | 5710 | ret = btrfs_check_data_free_space(inode, start, len); |
5747 | if (ret < 0) | 5711 | if (ret < 0) |
5748 | return ret; | 5712 | return ret; |
5749 | ret = btrfs_delalloc_reserve_metadata(inode, len); | 5713 | ret = btrfs_delalloc_reserve_metadata(inode, len); |
5750 | if (ret < 0) | 5714 | if (ret < 0) |
5751 | __btrfs_free_reserved_data_space(inode, start, len); | 5715 | btrfs_free_reserved_data_space(inode, start, len); |
5752 | return ret; | 5716 | return ret; |
5753 | } | 5717 | } |
5754 | 5718 | ||
5755 | /** | 5719 | /** |
5756 | * btrfs_delalloc_reserve_space - reserve data and metadata space for delalloc | 5720 | * btrfs_delalloc_release_space - release data and metadata space for delalloc |
5757 | * @inode: inode we're writing to | ||
5758 | * @num_bytes: the number of bytes we want to allocate | ||
5759 | * | ||
5760 | * This will do the following things | ||
5761 | * | ||
5762 | * o reserve space in the data space info for num_bytes | ||
5763 | * o reserve space in the metadata space info based on number of outstanding | ||
5764 | * extents and how much csums will be needed | ||
5765 | * o add to the inodes ->delalloc_bytes | ||
5766 | * o add it to the fs_info's delalloc inodes list. | ||
5767 | * | ||
5768 | * This will return 0 for success and -ENOSPC if there is no space left. | ||
5769 | */ | ||
5770 | int btrfs_delalloc_reserve_space(struct inode *inode, u64 num_bytes) | ||
5771 | { | ||
5772 | int ret; | ||
5773 | |||
5774 | ret = btrfs_check_data_free_space(inode, num_bytes, num_bytes); | ||
5775 | if (ret) | ||
5776 | return ret; | ||
5777 | |||
5778 | ret = btrfs_delalloc_reserve_metadata(inode, num_bytes); | ||
5779 | if (ret) { | ||
5780 | btrfs_free_reserved_data_space(inode, num_bytes); | ||
5781 | return ret; | ||
5782 | } | ||
5783 | |||
5784 | return 0; | ||
5785 | } | ||
5786 | |||
5787 | /** | ||
5788 | * __btrfs_delalloc_release_space - release data and metadata space for delalloc | ||
5789 | * @inode: inode we're releasing space for | 5721 | * @inode: inode we're releasing space for |
5790 | * @start: start position of the space already reserved | 5722 | * @start: start position of the space already reserved |
5791 | * @len: the len of the space already reserved | 5723 | * @len: the len of the space already reserved |
@@ -5799,29 +5731,10 @@ int btrfs_delalloc_reserve_space(struct inode *inode, u64 num_bytes) | |||
5799 | * list if there are no delalloc bytes left. | 5731 | * list if there are no delalloc bytes left. |
5800 | * Also it will handle the qgroup reserved space. | 5732 | * Also it will handle the qgroup reserved space. |
5801 | */ | 5733 | */ |
5802 | void __btrfs_delalloc_release_space(struct inode *inode, u64 start, u64 len) | 5734 | void btrfs_delalloc_release_space(struct inode *inode, u64 start, u64 len) |
5803 | { | 5735 | { |
5804 | btrfs_delalloc_release_metadata(inode, len); | 5736 | btrfs_delalloc_release_metadata(inode, len); |
5805 | __btrfs_free_reserved_data_space(inode, start, len); | 5737 | btrfs_free_reserved_data_space(inode, start, len); |
5806 | } | ||
5807 | |||
5808 | /** | ||
5809 | * btrfs_delalloc_release_space - release data and metadata space for delalloc | ||
5810 | * @inode: inode we're releasing space for | ||
5811 | * @num_bytes: the number of bytes we want to free up | ||
5812 | * | ||
5813 | * This must be matched with a call to btrfs_delalloc_reserve_space. This is | ||
5814 | * called in the case that we don't need the metadata AND data reservations | ||
5815 | * anymore. So if there is an error or we insert an inline extent. | ||
5816 | * | ||
5817 | * This function will release the metadata space that was not used and will | ||
5818 | * decrement ->delalloc_bytes and remove it from the fs_info delalloc_inodes | ||
5819 | * list if there are no delalloc bytes left. | ||
5820 | */ | ||
5821 | void btrfs_delalloc_release_space(struct inode *inode, u64 num_bytes) | ||
5822 | { | ||
5823 | btrfs_delalloc_release_metadata(inode, num_bytes); | ||
5824 | btrfs_free_reserved_data_space(inode, num_bytes); | ||
5825 | } | 5738 | } |
5826 | 5739 | ||
5827 | static int update_block_group(struct btrfs_trans_handle *trans, | 5740 | static int update_block_group(struct btrfs_trans_handle *trans, |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 29b3702fe10d..47785c8a7d39 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -1529,7 +1529,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
1529 | goto reserve_metadata; | 1529 | goto reserve_metadata; |
1530 | } | 1530 | } |
1531 | } | 1531 | } |
1532 | ret = __btrfs_check_data_free_space(inode, pos, write_bytes); | 1532 | ret = btrfs_check_data_free_space(inode, pos, write_bytes); |
1533 | if (ret < 0) | 1533 | if (ret < 0) |
1534 | break; | 1534 | break; |
1535 | 1535 | ||
@@ -1537,8 +1537,8 @@ reserve_metadata: | |||
1537 | ret = btrfs_delalloc_reserve_metadata(inode, reserve_bytes); | 1537 | ret = btrfs_delalloc_reserve_metadata(inode, reserve_bytes); |
1538 | if (ret) { | 1538 | if (ret) { |
1539 | if (!only_release_metadata) | 1539 | if (!only_release_metadata) |
1540 | __btrfs_free_reserved_data_space(inode, pos, | 1540 | btrfs_free_reserved_data_space(inode, pos, |
1541 | write_bytes); | 1541 | write_bytes); |
1542 | else | 1542 | else |
1543 | btrfs_end_write_no_snapshoting(root); | 1543 | btrfs_end_write_no_snapshoting(root); |
1544 | break; | 1544 | break; |
@@ -1608,7 +1608,7 @@ again: | |||
1608 | btrfs_delalloc_release_metadata(inode, | 1608 | btrfs_delalloc_release_metadata(inode, |
1609 | release_bytes); | 1609 | release_bytes); |
1610 | else | 1610 | else |
1611 | __btrfs_delalloc_release_space(inode, pos, | 1611 | btrfs_delalloc_release_space(inode, pos, |
1612 | release_bytes); | 1612 | release_bytes); |
1613 | } | 1613 | } |
1614 | 1614 | ||
@@ -1661,8 +1661,7 @@ again: | |||
1661 | btrfs_end_write_no_snapshoting(root); | 1661 | btrfs_end_write_no_snapshoting(root); |
1662 | btrfs_delalloc_release_metadata(inode, release_bytes); | 1662 | btrfs_delalloc_release_metadata(inode, release_bytes); |
1663 | } else { | 1663 | } else { |
1664 | __btrfs_delalloc_release_space(inode, pos, | 1664 | btrfs_delalloc_release_space(inode, pos, release_bytes); |
1665 | release_bytes); | ||
1666 | } | 1665 | } |
1667 | } | 1666 | } |
1668 | 1667 | ||
@@ -2708,8 +2707,8 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2708 | out: | 2707 | out: |
2709 | mutex_unlock(&inode->i_mutex); | 2708 | mutex_unlock(&inode->i_mutex); |
2710 | /* Let go of our reservation. */ | 2709 | /* Let go of our reservation. */ |
2711 | __btrfs_free_reserved_data_space(inode, alloc_start, | 2710 | btrfs_free_reserved_data_space(inode, alloc_start, |
2712 | alloc_end - alloc_start); | 2711 | alloc_end - alloc_start); |
2713 | return ret; | 2712 | return ret; |
2714 | } | 2713 | } |
2715 | 2714 | ||
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index 78bc09c552ab..767a6056ac45 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
@@ -488,17 +488,17 @@ again: | |||
488 | /* Just to make sure we have enough space */ | 488 | /* Just to make sure we have enough space */ |
489 | prealloc += 8 * PAGE_CACHE_SIZE; | 489 | prealloc += 8 * PAGE_CACHE_SIZE; |
490 | 490 | ||
491 | ret = __btrfs_delalloc_reserve_space(inode, 0, prealloc); | 491 | ret = btrfs_delalloc_reserve_space(inode, 0, prealloc); |
492 | if (ret) | 492 | if (ret) |
493 | goto out_put; | 493 | goto out_put; |
494 | 494 | ||
495 | ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, prealloc, | 495 | ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, prealloc, |
496 | prealloc, prealloc, &alloc_hint); | 496 | prealloc, prealloc, &alloc_hint); |
497 | if (ret) { | 497 | if (ret) { |
498 | __btrfs_delalloc_release_space(inode, 0, prealloc); | 498 | btrfs_delalloc_release_space(inode, 0, prealloc); |
499 | goto out_put; | 499 | goto out_put; |
500 | } | 500 | } |
501 | __btrfs_free_reserved_data_space(inode, 0, prealloc); | 501 | btrfs_free_reserved_data_space(inode, 0, prealloc); |
502 | 502 | ||
503 | ret = btrfs_write_out_ino_cache(root, trans, path, inode); | 503 | ret = btrfs_write_out_ino_cache(root, trans, path, inode); |
504 | out_put: | 504 | out_put: |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a3942a70f97d..a34e5a9c51cb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1769,8 +1769,8 @@ static void btrfs_clear_bit_hook(struct inode *inode, | |||
1769 | 1769 | ||
1770 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID | 1770 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID |
1771 | && do_list && !(state->state & EXTENT_NORESERVE)) | 1771 | && do_list && !(state->state & EXTENT_NORESERVE)) |
1772 | __btrfs_free_reserved_data_space(inode, state->start, | 1772 | btrfs_free_reserved_data_space(inode, state->start, |
1773 | len); | 1773 | len); |
1774 | 1774 | ||
1775 | __percpu_counter_add(&root->fs_info->delalloc_bytes, -len, | 1775 | __percpu_counter_add(&root->fs_info->delalloc_bytes, -len, |
1776 | root->fs_info->delalloc_batch); | 1776 | root->fs_info->delalloc_batch); |
@@ -1993,8 +1993,8 @@ again: | |||
1993 | goto again; | 1993 | goto again; |
1994 | } | 1994 | } |
1995 | 1995 | ||
1996 | ret = __btrfs_delalloc_reserve_space(inode, page_start, | 1996 | ret = btrfs_delalloc_reserve_space(inode, page_start, |
1997 | PAGE_CACHE_SIZE); | 1997 | PAGE_CACHE_SIZE); |
1998 | if (ret) { | 1998 | if (ret) { |
1999 | mapping_set_error(page->mapping, ret); | 1999 | mapping_set_error(page->mapping, ret); |
2000 | end_extent_writepage(page, ret, page_start, page_end); | 2000 | end_extent_writepage(page, ret, page_start, page_end); |
@@ -4640,7 +4640,7 @@ int btrfs_truncate_page(struct inode *inode, loff_t from, loff_t len, | |||
4640 | if ((offset & (blocksize - 1)) == 0 && | 4640 | if ((offset & (blocksize - 1)) == 0 && |
4641 | (!len || ((len & (blocksize - 1)) == 0))) | 4641 | (!len || ((len & (blocksize - 1)) == 0))) |
4642 | goto out; | 4642 | goto out; |
4643 | ret = __btrfs_delalloc_reserve_space(inode, | 4643 | ret = btrfs_delalloc_reserve_space(inode, |
4644 | round_down(from, PAGE_CACHE_SIZE), PAGE_CACHE_SIZE); | 4644 | round_down(from, PAGE_CACHE_SIZE), PAGE_CACHE_SIZE); |
4645 | if (ret) | 4645 | if (ret) |
4646 | goto out; | 4646 | goto out; |
@@ -4648,7 +4648,7 @@ int btrfs_truncate_page(struct inode *inode, loff_t from, loff_t len, | |||
4648 | again: | 4648 | again: |
4649 | page = find_or_create_page(mapping, index, mask); | 4649 | page = find_or_create_page(mapping, index, mask); |
4650 | if (!page) { | 4650 | if (!page) { |
4651 | __btrfs_delalloc_release_space(inode, | 4651 | btrfs_delalloc_release_space(inode, |
4652 | round_down(from, PAGE_CACHE_SIZE), | 4652 | round_down(from, PAGE_CACHE_SIZE), |
4653 | PAGE_CACHE_SIZE); | 4653 | PAGE_CACHE_SIZE); |
4654 | ret = -ENOMEM; | 4654 | ret = -ENOMEM; |
@@ -4718,8 +4718,8 @@ again: | |||
4718 | 4718 | ||
4719 | out_unlock: | 4719 | out_unlock: |
4720 | if (ret) | 4720 | if (ret) |
4721 | __btrfs_delalloc_release_space(inode, page_start, | 4721 | btrfs_delalloc_release_space(inode, page_start, |
4722 | PAGE_CACHE_SIZE); | 4722 | PAGE_CACHE_SIZE); |
4723 | unlock_page(page); | 4723 | unlock_page(page); |
4724 | page_cache_release(page); | 4724 | page_cache_release(page); |
4725 | out: | 4725 | out: |
@@ -7650,7 +7650,7 @@ unlock: | |||
7650 | spin_unlock(&BTRFS_I(inode)->lock); | 7650 | spin_unlock(&BTRFS_I(inode)->lock); |
7651 | } | 7651 | } |
7652 | 7652 | ||
7653 | __btrfs_free_reserved_data_space(inode, start, len); | 7653 | btrfs_free_reserved_data_space(inode, start, len); |
7654 | WARN_ON(dio_data->reserve < len); | 7654 | WARN_ON(dio_data->reserve < len); |
7655 | dio_data->reserve -= len; | 7655 | dio_data->reserve -= len; |
7656 | current->journal_info = dio_data; | 7656 | current->journal_info = dio_data; |
@@ -8440,7 +8440,7 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | |||
8440 | mutex_unlock(&inode->i_mutex); | 8440 | mutex_unlock(&inode->i_mutex); |
8441 | relock = true; | 8441 | relock = true; |
8442 | } | 8442 | } |
8443 | ret = __btrfs_delalloc_reserve_space(inode, offset, count); | 8443 | ret = btrfs_delalloc_reserve_space(inode, offset, count); |
8444 | if (ret) | 8444 | if (ret) |
8445 | goto out; | 8445 | goto out; |
8446 | dio_data.outstanding_extents = div64_u64(count + | 8446 | dio_data.outstanding_extents = div64_u64(count + |
@@ -8469,11 +8469,11 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter, | |||
8469 | current->journal_info = NULL; | 8469 | current->journal_info = NULL; |
8470 | if (ret < 0 && ret != -EIOCBQUEUED) { | 8470 | if (ret < 0 && ret != -EIOCBQUEUED) { |
8471 | if (dio_data.reserve) | 8471 | if (dio_data.reserve) |
8472 | __btrfs_delalloc_release_space(inode, offset, | 8472 | btrfs_delalloc_release_space(inode, offset, |
8473 | dio_data.reserve); | 8473 | dio_data.reserve); |
8474 | } else if (ret >= 0 && (size_t)ret < count) | 8474 | } else if (ret >= 0 && (size_t)ret < count) |
8475 | __btrfs_delalloc_release_space(inode, offset, | 8475 | btrfs_delalloc_release_space(inode, offset, |
8476 | count - (size_t)ret); | 8476 | count - (size_t)ret); |
8477 | } | 8477 | } |
8478 | out: | 8478 | out: |
8479 | if (wakeup) | 8479 | if (wakeup) |
@@ -8684,8 +8684,8 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
8684 | page_start = page_offset(page); | 8684 | page_start = page_offset(page); |
8685 | page_end = page_start + PAGE_CACHE_SIZE - 1; | 8685 | page_end = page_start + PAGE_CACHE_SIZE - 1; |
8686 | 8686 | ||
8687 | ret = __btrfs_delalloc_reserve_space(inode, page_start, | 8687 | ret = btrfs_delalloc_reserve_space(inode, page_start, |
8688 | PAGE_CACHE_SIZE); | 8688 | PAGE_CACHE_SIZE); |
8689 | if (!ret) { | 8689 | if (!ret) { |
8690 | ret = file_update_time(vma->vm_file); | 8690 | ret = file_update_time(vma->vm_file); |
8691 | reserved = 1; | 8691 | reserved = 1; |
@@ -8780,7 +8780,7 @@ out_unlock: | |||
8780 | } | 8780 | } |
8781 | unlock_page(page); | 8781 | unlock_page(page); |
8782 | out: | 8782 | out: |
8783 | __btrfs_delalloc_release_space(inode, page_start, PAGE_CACHE_SIZE); | 8783 | btrfs_delalloc_release_space(inode, page_start, PAGE_CACHE_SIZE); |
8784 | out_noreserve: | 8784 | out_noreserve: |
8785 | sb_end_pagefault(inode->i_sb); | 8785 | sb_end_pagefault(inode->i_sb); |
8786 | return ret; | 8786 | return ret; |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 70732e629b0f..7ed033a84212 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -1119,7 +1119,7 @@ static int cluster_pages_for_defrag(struct inode *inode, | |||
1119 | 1119 | ||
1120 | page_cnt = min_t(u64, (u64)num_pages, (u64)file_end - start_index + 1); | 1120 | page_cnt = min_t(u64, (u64)num_pages, (u64)file_end - start_index + 1); |
1121 | 1121 | ||
1122 | ret = __btrfs_delalloc_reserve_space(inode, | 1122 | ret = btrfs_delalloc_reserve_space(inode, |
1123 | start_index << PAGE_CACHE_SHIFT, | 1123 | start_index << PAGE_CACHE_SHIFT, |
1124 | page_cnt << PAGE_CACHE_SHIFT); | 1124 | page_cnt << PAGE_CACHE_SHIFT); |
1125 | if (ret) | 1125 | if (ret) |
@@ -1210,7 +1210,7 @@ again: | |||
1210 | spin_lock(&BTRFS_I(inode)->lock); | 1210 | spin_lock(&BTRFS_I(inode)->lock); |
1211 | BTRFS_I(inode)->outstanding_extents++; | 1211 | BTRFS_I(inode)->outstanding_extents++; |
1212 | spin_unlock(&BTRFS_I(inode)->lock); | 1212 | spin_unlock(&BTRFS_I(inode)->lock); |
1213 | __btrfs_delalloc_release_space(inode, | 1213 | btrfs_delalloc_release_space(inode, |
1214 | start_index << PAGE_CACHE_SHIFT, | 1214 | start_index << PAGE_CACHE_SHIFT, |
1215 | (page_cnt - i_done) << PAGE_CACHE_SHIFT); | 1215 | (page_cnt - i_done) << PAGE_CACHE_SHIFT); |
1216 | } | 1216 | } |
@@ -1237,7 +1237,7 @@ out: | |||
1237 | unlock_page(pages[i]); | 1237 | unlock_page(pages[i]); |
1238 | page_cache_release(pages[i]); | 1238 | page_cache_release(pages[i]); |
1239 | } | 1239 | } |
1240 | __btrfs_delalloc_release_space(inode, | 1240 | btrfs_delalloc_release_space(inode, |
1241 | start_index << PAGE_CACHE_SHIFT, | 1241 | start_index << PAGE_CACHE_SHIFT, |
1242 | page_cnt << PAGE_CACHE_SHIFT); | 1242 | page_cnt << PAGE_CACHE_SHIFT); |
1243 | return ret; | 1243 | return ret; |
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 897a49d71638..7d5339da01b8 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
@@ -2035,7 +2035,7 @@ out: | |||
2035 | return ret; | 2035 | return ret; |
2036 | } | 2036 | } |
2037 | 2037 | ||
2038 | int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes) | 2038 | static int qgroup_reserve(struct btrfs_root *root, u64 num_bytes) |
2039 | { | 2039 | { |
2040 | struct btrfs_root *quota_root; | 2040 | struct btrfs_root *quota_root; |
2041 | struct btrfs_qgroup *qgroup; | 2041 | struct btrfs_qgroup *qgroup; |
@@ -2168,6 +2168,11 @@ out: | |||
2168 | spin_unlock(&fs_info->qgroup_lock); | 2168 | spin_unlock(&fs_info->qgroup_lock); |
2169 | } | 2169 | } |
2170 | 2170 | ||
2171 | static inline void qgroup_free(struct btrfs_root *root, u64 num_bytes) | ||
2172 | { | ||
2173 | return btrfs_qgroup_free_refroot(root->fs_info, root->objectid, | ||
2174 | num_bytes); | ||
2175 | } | ||
2171 | void assert_qgroups_uptodate(struct btrfs_trans_handle *trans) | 2176 | void assert_qgroups_uptodate(struct btrfs_trans_handle *trans) |
2172 | { | 2177 | { |
2173 | if (list_empty(&trans->qgroup_ref_list) && !trans->delayed_ref_elem.seq) | 2178 | if (list_empty(&trans->qgroup_ref_list) && !trans->delayed_ref_elem.seq) |
@@ -2517,7 +2522,7 @@ int btrfs_qgroup_reserve_data(struct inode *inode, u64 start, u64 len) | |||
2517 | &changeset); | 2522 | &changeset); |
2518 | if (ret < 0) | 2523 | if (ret < 0) |
2519 | goto cleanup; | 2524 | goto cleanup; |
2520 | ret = btrfs_qgroup_reserve(root, changeset.bytes_changed); | 2525 | ret = qgroup_reserve(root, changeset.bytes_changed); |
2521 | if (ret < 0) | 2526 | if (ret < 0) |
2522 | goto cleanup; | 2527 | goto cleanup; |
2523 | 2528 | ||
@@ -2553,8 +2558,7 @@ static int __btrfs_qgroup_release_data(struct inode *inode, u64 start, u64 len, | |||
2553 | goto out; | 2558 | goto out; |
2554 | 2559 | ||
2555 | if (free) | 2560 | if (free) |
2556 | btrfs_qgroup_free(BTRFS_I(inode)->root, | 2561 | qgroup_free(BTRFS_I(inode)->root, changeset.bytes_changed); |
2557 | changeset.bytes_changed); | ||
2558 | out: | 2562 | out: |
2559 | ulist_free(changeset.range_changed); | 2563 | ulist_free(changeset.range_changed); |
2560 | return ret; | 2564 | return ret; |
@@ -2604,7 +2608,7 @@ int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes) | |||
2604 | return 0; | 2608 | return 0; |
2605 | 2609 | ||
2606 | BUG_ON(num_bytes != round_down(num_bytes, root->nodesize)); | 2610 | BUG_ON(num_bytes != round_down(num_bytes, root->nodesize)); |
2607 | ret = btrfs_qgroup_reserve(root, num_bytes); | 2611 | ret = qgroup_reserve(root, num_bytes); |
2608 | if (ret < 0) | 2612 | if (ret < 0) |
2609 | return ret; | 2613 | return ret; |
2610 | atomic_add(num_bytes, &root->qgroup_meta_rsv); | 2614 | atomic_add(num_bytes, &root->qgroup_meta_rsv); |
@@ -2621,7 +2625,7 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root *root) | |||
2621 | reserved = atomic_xchg(&root->qgroup_meta_rsv, 0); | 2625 | reserved = atomic_xchg(&root->qgroup_meta_rsv, 0); |
2622 | if (reserved == 0) | 2626 | if (reserved == 0) |
2623 | return; | 2627 | return; |
2624 | btrfs_qgroup_free(root, reserved); | 2628 | qgroup_free(root, reserved); |
2625 | } | 2629 | } |
2626 | 2630 | ||
2627 | void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes) | 2631 | void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes) |
@@ -2632,5 +2636,5 @@ void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes) | |||
2632 | BUG_ON(num_bytes != round_down(num_bytes, root->nodesize)); | 2636 | BUG_ON(num_bytes != round_down(num_bytes, root->nodesize)); |
2633 | WARN_ON(atomic_read(&root->qgroup_meta_rsv) < num_bytes); | 2637 | WARN_ON(atomic_read(&root->qgroup_meta_rsv) < num_bytes); |
2634 | atomic_sub(num_bytes, &root->qgroup_meta_rsv); | 2638 | atomic_sub(num_bytes, &root->qgroup_meta_rsv); |
2635 | btrfs_qgroup_free(root, num_bytes); | 2639 | qgroup_free(root, num_bytes); |
2636 | } | 2640 | } |
diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h index 7d1c87cd3c78..adb03da3d298 100644 --- a/fs/btrfs/qgroup.h +++ b/fs/btrfs/qgroup.h | |||
@@ -71,15 +71,8 @@ int btrfs_run_qgroups(struct btrfs_trans_handle *trans, | |||
71 | int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, | 71 | int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, |
72 | struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid, | 72 | struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid, |
73 | struct btrfs_qgroup_inherit *inherit); | 73 | struct btrfs_qgroup_inherit *inherit); |
74 | int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes); | ||
75 | void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, | 74 | void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, |
76 | u64 ref_root, u64 num_bytes); | 75 | u64 ref_root, u64 num_bytes); |
77 | static inline void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes) | ||
78 | { | ||
79 | return btrfs_qgroup_free_refroot(root->fs_info, root->objectid, | ||
80 | num_bytes); | ||
81 | } | ||
82 | |||
83 | /* | 76 | /* |
84 | * TODO: Add proper trace point for it, as btrfs_qgroup_free() is | 77 | * TODO: Add proper trace point for it, as btrfs_qgroup_free() is |
85 | * called by everywhere, can't provide good trace for delayed ref case. | 78 | * called by everywhere, can't provide good trace for delayed ref case. |
@@ -89,7 +82,6 @@ static inline void btrfs_qgroup_free_delayed_ref(struct btrfs_fs_info *fs_info, | |||
89 | { | 82 | { |
90 | btrfs_qgroup_free_refroot(fs_info, ref_root, num_bytes); | 83 | btrfs_qgroup_free_refroot(fs_info, ref_root, num_bytes); |
91 | } | 84 | } |
92 | |||
93 | void assert_qgroups_uptodate(struct btrfs_trans_handle *trans); | 85 | void assert_qgroups_uptodate(struct btrfs_trans_handle *trans); |
94 | 86 | ||
95 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | 87 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 490c9e298c58..a7dc45622e90 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -3034,8 +3034,8 @@ int prealloc_file_extent_cluster(struct inode *inode, | |||
3034 | BUG_ON(cluster->start != cluster->boundary[0]); | 3034 | BUG_ON(cluster->start != cluster->boundary[0]); |
3035 | mutex_lock(&inode->i_mutex); | 3035 | mutex_lock(&inode->i_mutex); |
3036 | 3036 | ||
3037 | ret = __btrfs_check_data_free_space(inode, cluster->start, | 3037 | ret = btrfs_check_data_free_space(inode, cluster->start, |
3038 | cluster->end + 1 - cluster->start); | 3038 | cluster->end + 1 - cluster->start); |
3039 | if (ret) | 3039 | if (ret) |
3040 | goto out; | 3040 | goto out; |
3041 | 3041 | ||
@@ -3056,8 +3056,8 @@ int prealloc_file_extent_cluster(struct inode *inode, | |||
3056 | break; | 3056 | break; |
3057 | nr++; | 3057 | nr++; |
3058 | } | 3058 | } |
3059 | __btrfs_free_reserved_data_space(inode, cluster->start, | 3059 | btrfs_free_reserved_data_space(inode, cluster->start, |
3060 | cluster->end + 1 - cluster->start); | 3060 | cluster->end + 1 - cluster->start); |
3061 | out: | 3061 | out: |
3062 | mutex_unlock(&inode->i_mutex); | 3062 | mutex_unlock(&inode->i_mutex); |
3063 | return ret; | 3063 | return ret; |