|
@@ -484,15 +484,17 @@ cont:
|
|
|
compress_type, pages);
|
|
|
}
|
|
|
if (ret <= 0) {
|
|
|
+ unsigned long clear_flags = EXTENT_DELALLOC |
|
|
|
+ EXTENT_DEFRAG;
|
|
|
+ clear_flags |= (ret < 0) ? EXTENT_DO_ACCOUNTING : 0;
|
|
|
+
|
|
|
/*
|
|
|
* inline extent creation worked or returned error,
|
|
|
* we don't need to create any more async work items.
|
|
|
* Unlock and free up our temp pages.
|
|
|
*/
|
|
|
extent_clear_unlock_delalloc(inode, start, end, NULL,
|
|
|
- EXTENT_DIRTY |
|
|
|
- EXTENT_DELALLOC,
|
|
|
- PAGE_UNLOCK |
|
|
|
+ clear_flags, PAGE_UNLOCK |
|
|
|
PAGE_CLEAR_DIRTY |
|
|
|
PAGE_SET_WRITEBACK |
|
|
|
PAGE_END_WRITEBACK);
|
|
@@ -593,9 +595,10 @@ free_pages_out:
|
|
|
|
|
|
cleanup_and_out:
|
|
|
extent_clear_unlock_delalloc(inode, start, end, NULL,
|
|
|
- EXTENT_DIRTY | EXTENT_DELALLOC,
|
|
|
- PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
|
|
|
- PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK);
|
|
|
+ EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING |
|
|
|
+ EXTENT_DEFRAG, PAGE_UNLOCK |
|
|
|
+ PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
|
|
|
+ PAGE_END_WRITEBACK);
|
|
|
if (!trans || IS_ERR(trans))
|
|
|
btrfs_error(root->fs_info, ret, "Failed to join transaction");
|
|
|
else
|
|
@@ -770,8 +773,8 @@ retry:
|
|
|
extent_clear_unlock_delalloc(inode, async_extent->start,
|
|
|
async_extent->start +
|
|
|
async_extent->ram_size - 1,
|
|
|
- NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
|
|
|
- EXTENT_DIRTY, PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
|
|
|
+ NULL, EXTENT_LOCKED | EXTENT_DELALLOC,
|
|
|
+ PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
|
|
|
PAGE_SET_WRITEBACK);
|
|
|
ret = btrfs_submit_compressed_write(inode,
|
|
|
async_extent->start,
|
|
@@ -795,9 +798,9 @@ out_free:
|
|
|
async_extent->start +
|
|
|
async_extent->ram_size - 1,
|
|
|
NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
|
|
|
- EXTENT_DIRTY, PAGE_UNLOCK |
|
|
|
- PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
|
|
|
- PAGE_END_WRITEBACK);
|
|
|
+ EXTENT_DEFRAG | EXTENT_DO_ACCOUNTING,
|
|
|
+ PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
|
|
|
+ PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK);
|
|
|
kfree(async_extent);
|
|
|
goto again;
|
|
|
}
|
|
@@ -884,7 +887,7 @@ static noinline int __cow_file_range(struct btrfs_trans_handle *trans,
|
|
|
if (ret == 0) {
|
|
|
extent_clear_unlock_delalloc(inode, start, end, NULL,
|
|
|
EXTENT_LOCKED | EXTENT_DELALLOC |
|
|
|
- EXTENT_DIRTY, PAGE_UNLOCK |
|
|
|
+ EXTENT_DEFRAG, PAGE_UNLOCK |
|
|
|
PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
|
|
|
PAGE_END_WRITEBACK);
|
|
|
|
|
@@ -995,10 +998,10 @@ out_reserve:
|
|
|
btrfs_free_reserved_extent(root, ins.objectid, ins.offset);
|
|
|
out_unlock:
|
|
|
extent_clear_unlock_delalloc(inode, start, end, locked_page,
|
|
|
- EXTENT_LOCKED | EXTENT_DIRTY |
|
|
|
- EXTENT_DELALLOC, PAGE_UNLOCK |
|
|
|
- PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK |
|
|
|
- PAGE_END_WRITEBACK);
|
|
|
+ EXTENT_LOCKED | EXTENT_DO_ACCOUNTING |
|
|
|
+ EXTENT_DELALLOC | EXTENT_DEFRAG,
|
|
|
+ PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
|
|
|
+ PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK);
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -1016,7 +1019,8 @@ static noinline int cow_file_range(struct inode *inode,
|
|
|
if (IS_ERR(trans)) {
|
|
|
extent_clear_unlock_delalloc(inode, start, end, locked_page,
|
|
|
EXTENT_LOCKED | EXTENT_DELALLOC |
|
|
|
- EXTENT_DIRTY, PAGE_UNLOCK |
|
|
|
+ EXTENT_DO_ACCOUNTING |
|
|
|
+ EXTENT_DEFRAG, PAGE_UNLOCK |
|
|
|
PAGE_CLEAR_DIRTY |
|
|
|
PAGE_SET_WRITEBACK |
|
|
|
PAGE_END_WRITEBACK);
|
|
@@ -1201,7 +1205,8 @@ static noinline int run_delalloc_nocow(struct inode *inode,
|
|
|
if (!path) {
|
|
|
extent_clear_unlock_delalloc(inode, start, end, locked_page,
|
|
|
EXTENT_LOCKED | EXTENT_DELALLOC |
|
|
|
- EXTENT_DIRTY, PAGE_UNLOCK |
|
|
|
+ EXTENT_DO_ACCOUNTING |
|
|
|
+ EXTENT_DEFRAG, PAGE_UNLOCK |
|
|
|
PAGE_CLEAR_DIRTY |
|
|
|
PAGE_SET_WRITEBACK |
|
|
|
PAGE_END_WRITEBACK);
|
|
@@ -1218,7 +1223,8 @@ static noinline int run_delalloc_nocow(struct inode *inode,
|
|
|
if (IS_ERR(trans)) {
|
|
|
extent_clear_unlock_delalloc(inode, start, end, locked_page,
|
|
|
EXTENT_LOCKED | EXTENT_DELALLOC |
|
|
|
- EXTENT_DIRTY, PAGE_UNLOCK |
|
|
|
+ EXTENT_DO_ACCOUNTING |
|
|
|
+ EXTENT_DEFRAG, PAGE_UNLOCK |
|
|
|
PAGE_CLEAR_DIRTY |
|
|
|
PAGE_SET_WRITEBACK |
|
|
|
PAGE_END_WRITEBACK);
|
|
@@ -1434,8 +1440,9 @@ error:
|
|
|
if (ret && cur_offset < end)
|
|
|
extent_clear_unlock_delalloc(inode, cur_offset, end,
|
|
|
locked_page, EXTENT_LOCKED |
|
|
|
- EXTENT_DELALLOC | EXTENT_DIRTY,
|
|
|
- PAGE_UNLOCK | PAGE_CLEAR_DIRTY |
|
|
|
+ EXTENT_DELALLOC | EXTENT_DEFRAG |
|
|
|
+ EXTENT_DO_ACCOUNTING, PAGE_UNLOCK |
|
|
|
+ PAGE_CLEAR_DIRTY |
|
|
|
PAGE_SET_WRITEBACK |
|
|
|
PAGE_END_WRITEBACK);
|
|
|
btrfs_free_path(path);
|