diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2016-09-26 15:47:03 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-26 15:47:03 -0400 |
| commit | 1e1b37273cf719545da50b76f214f983a710aaf4 (patch) | |
| tree | 033f6062325ef7aaeefe8559bb409ab7d2be3c76 /fs/btrfs/inode.c | |
| parent | c183a603e8d8a5a189729b77d0c623a3d5950e5f (diff) | |
| parent | c291b015158577be533dd5a959dfc09bab119eed (diff) | |
Merge branch 'x86/urgent' into x86/apic
Bring in the upstream modifications so we can fixup the silent merge
conflict which is introduced by this merge.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 08dfc57e2270..e6811c42e41e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -566,6 +566,8 @@ cont: | |||
| 566 | PAGE_SET_WRITEBACK | | 566 | PAGE_SET_WRITEBACK | |
| 567 | page_error_op | | 567 | page_error_op | |
| 568 | PAGE_END_WRITEBACK); | 568 | PAGE_END_WRITEBACK); |
| 569 | btrfs_free_reserved_data_space_noquota(inode, start, | ||
| 570 | end - start + 1); | ||
| 569 | goto free_pages_out; | 571 | goto free_pages_out; |
| 570 | } | 572 | } |
| 571 | } | 573 | } |
| @@ -742,7 +744,7 @@ retry: | |||
| 742 | lock_extent(io_tree, async_extent->start, | 744 | lock_extent(io_tree, async_extent->start, |
| 743 | async_extent->start + async_extent->ram_size - 1); | 745 | async_extent->start + async_extent->ram_size - 1); |
| 744 | 746 | ||
| 745 | ret = btrfs_reserve_extent(root, | 747 | ret = btrfs_reserve_extent(root, async_extent->ram_size, |
| 746 | async_extent->compressed_size, | 748 | async_extent->compressed_size, |
| 747 | async_extent->compressed_size, | 749 | async_extent->compressed_size, |
| 748 | 0, alloc_hint, &ins, 1, 1); | 750 | 0, alloc_hint, &ins, 1, 1); |
| @@ -969,7 +971,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 969 | EXTENT_DEFRAG, PAGE_UNLOCK | | 971 | EXTENT_DEFRAG, PAGE_UNLOCK | |
| 970 | PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK | | 972 | PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK | |
| 971 | PAGE_END_WRITEBACK); | 973 | PAGE_END_WRITEBACK); |
| 972 | 974 | btrfs_free_reserved_data_space_noquota(inode, start, | |
| 975 | end - start + 1); | ||
| 973 | *nr_written = *nr_written + | 976 | *nr_written = *nr_written + |
| 974 | (end - start + PAGE_SIZE) / PAGE_SIZE; | 977 | (end - start + PAGE_SIZE) / PAGE_SIZE; |
| 975 | *page_started = 1; | 978 | *page_started = 1; |
| @@ -989,7 +992,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 989 | unsigned long op; | 992 | unsigned long op; |
| 990 | 993 | ||
| 991 | cur_alloc_size = disk_num_bytes; | 994 | cur_alloc_size = disk_num_bytes; |
| 992 | ret = btrfs_reserve_extent(root, cur_alloc_size, | 995 | ret = btrfs_reserve_extent(root, cur_alloc_size, cur_alloc_size, |
| 993 | root->sectorsize, 0, alloc_hint, | 996 | root->sectorsize, 0, alloc_hint, |
| 994 | &ins, 1, 1); | 997 | &ins, 1, 1); |
| 995 | if (ret < 0) | 998 | if (ret < 0) |
| @@ -1489,8 +1492,10 @@ out_check: | |||
| 1489 | extent_clear_unlock_delalloc(inode, cur_offset, | 1492 | extent_clear_unlock_delalloc(inode, cur_offset, |
| 1490 | cur_offset + num_bytes - 1, | 1493 | cur_offset + num_bytes - 1, |
| 1491 | locked_page, EXTENT_LOCKED | | 1494 | locked_page, EXTENT_LOCKED | |
| 1492 | EXTENT_DELALLOC, PAGE_UNLOCK | | 1495 | EXTENT_DELALLOC | |
| 1493 | PAGE_SET_PRIVATE2); | 1496 | EXTENT_CLEAR_DATA_RESV, |
| 1497 | PAGE_UNLOCK | PAGE_SET_PRIVATE2); | ||
| 1498 | |||
| 1494 | if (!nolock && nocow) | 1499 | if (!nolock && nocow) |
| 1495 | btrfs_end_write_no_snapshoting(root); | 1500 | btrfs_end_write_no_snapshoting(root); |
| 1496 | cur_offset = extent_end; | 1501 | cur_offset = extent_end; |
| @@ -1807,7 +1812,9 @@ static void btrfs_clear_bit_hook(struct inode *inode, | |||
| 1807 | return; | 1812 | return; |
| 1808 | 1813 | ||
| 1809 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID | 1814 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID |
| 1810 | && do_list && !(state->state & EXTENT_NORESERVE)) | 1815 | && do_list && !(state->state & EXTENT_NORESERVE) |
| 1816 | && (*bits & (EXTENT_DO_ACCOUNTING | | ||
| 1817 | EXTENT_CLEAR_DATA_RESV))) | ||
| 1811 | btrfs_free_reserved_data_space_noquota(inode, | 1818 | btrfs_free_reserved_data_space_noquota(inode, |
| 1812 | state->start, len); | 1819 | state->start, len); |
| 1813 | 1820 | ||
| @@ -7251,7 +7258,7 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
| 7251 | int ret; | 7258 | int ret; |
| 7252 | 7259 | ||
| 7253 | alloc_hint = get_extent_allocation_hint(inode, start, len); | 7260 | alloc_hint = get_extent_allocation_hint(inode, start, len); |
| 7254 | ret = btrfs_reserve_extent(root, len, root->sectorsize, 0, | 7261 | ret = btrfs_reserve_extent(root, len, len, root->sectorsize, 0, |
| 7255 | alloc_hint, &ins, 1, 1); | 7262 | alloc_hint, &ins, 1, 1); |
| 7256 | if (ret) | 7263 | if (ret) |
| 7257 | return ERR_PTR(ret); | 7264 | return ERR_PTR(ret); |
| @@ -7751,6 +7758,13 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 7751 | ret = PTR_ERR(em2); | 7758 | ret = PTR_ERR(em2); |
| 7752 | goto unlock_err; | 7759 | goto unlock_err; |
| 7753 | } | 7760 | } |
| 7761 | /* | ||
| 7762 | * For inode marked NODATACOW or extent marked PREALLOC, | ||
| 7763 | * use the existing or preallocated extent, so does not | ||
| 7764 | * need to adjust btrfs_space_info's bytes_may_use. | ||
| 7765 | */ | ||
| 7766 | btrfs_free_reserved_data_space_noquota(inode, | ||
| 7767 | start, len); | ||
| 7754 | goto unlock; | 7768 | goto unlock; |
| 7755 | } | 7769 | } |
| 7756 | } | 7770 | } |
| @@ -7785,7 +7799,6 @@ unlock: | |||
| 7785 | i_size_write(inode, start + len); | 7799 | i_size_write(inode, start + len); |
| 7786 | 7800 | ||
| 7787 | adjust_dio_outstanding_extents(inode, dio_data, len); | 7801 | adjust_dio_outstanding_extents(inode, dio_data, len); |
| 7788 | btrfs_free_reserved_data_space(inode, start, len); | ||
| 7789 | WARN_ON(dio_data->reserve < len); | 7802 | WARN_ON(dio_data->reserve < len); |
| 7790 | dio_data->reserve -= len; | 7803 | dio_data->reserve -= len; |
| 7791 | dio_data->unsubmitted_oe_range_end = start + len; | 7804 | dio_data->unsubmitted_oe_range_end = start + len; |
| @@ -10306,6 +10319,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
| 10306 | u64 last_alloc = (u64)-1; | 10319 | u64 last_alloc = (u64)-1; |
| 10307 | int ret = 0; | 10320 | int ret = 0; |
| 10308 | bool own_trans = true; | 10321 | bool own_trans = true; |
| 10322 | u64 end = start + num_bytes - 1; | ||
| 10309 | 10323 | ||
| 10310 | if (trans) | 10324 | if (trans) |
| 10311 | own_trans = false; | 10325 | own_trans = false; |
| @@ -10327,8 +10341,8 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
| 10327 | * sized chunks. | 10341 | * sized chunks. |
| 10328 | */ | 10342 | */ |
| 10329 | cur_bytes = min(cur_bytes, last_alloc); | 10343 | cur_bytes = min(cur_bytes, last_alloc); |
| 10330 | ret = btrfs_reserve_extent(root, cur_bytes, min_size, 0, | 10344 | ret = btrfs_reserve_extent(root, cur_bytes, cur_bytes, |
| 10331 | *alloc_hint, &ins, 1, 0); | 10345 | min_size, 0, *alloc_hint, &ins, 1, 0); |
| 10332 | if (ret) { | 10346 | if (ret) { |
| 10333 | if (own_trans) | 10347 | if (own_trans) |
| 10334 | btrfs_end_transaction(trans, root); | 10348 | btrfs_end_transaction(trans, root); |
| @@ -10414,6 +10428,9 @@ next: | |||
| 10414 | if (own_trans) | 10428 | if (own_trans) |
| 10415 | btrfs_end_transaction(trans, root); | 10429 | btrfs_end_transaction(trans, root); |
| 10416 | } | 10430 | } |
| 10431 | if (cur_offset < end) | ||
| 10432 | btrfs_free_reserved_data_space(inode, cur_offset, | ||
| 10433 | end - cur_offset + 1); | ||
| 10417 | return ret; | 10434 | return ret; |
| 10418 | } | 10435 | } |
| 10419 | 10436 | ||
