diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2b790bda7998..8e3a5a266917 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -4605,8 +4605,8 @@ delete: | |||
4605 | BUG_ON(ret); | 4605 | BUG_ON(ret); |
4606 | if (btrfs_should_throttle_delayed_refs(trans, root)) | 4606 | if (btrfs_should_throttle_delayed_refs(trans, root)) |
4607 | btrfs_async_run_delayed_refs(root, | 4607 | btrfs_async_run_delayed_refs(root, |
4608 | trans->transid, | 4608 | trans->delayed_ref_updates * 2, |
4609 | trans->delayed_ref_updates * 2, 0); | 4609 | trans->transid, 0); |
4610 | if (be_nice) { | 4610 | if (be_nice) { |
4611 | if (truncate_space_check(trans, root, | 4611 | if (truncate_space_check(trans, root, |
4612 | extent_num_bytes)) { | 4612 | extent_num_bytes)) { |
@@ -8931,9 +8931,14 @@ again: | |||
8931 | * So even we call qgroup_free_data(), it won't decrease reserved | 8931 | * So even we call qgroup_free_data(), it won't decrease reserved |
8932 | * space. | 8932 | * space. |
8933 | * 2) Not written to disk | 8933 | * 2) Not written to disk |
8934 | * This means the reserved space should be freed here. | 8934 | * This means the reserved space should be freed here. However, |
8935 | * if a truncate invalidates the page (by clearing PageDirty) | ||
8936 | * and the page is accounted for while allocating extent | ||
8937 | * in btrfs_check_data_free_space() we let delayed_ref to | ||
8938 | * free the entire extent. | ||
8935 | */ | 8939 | */ |
8936 | btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE); | 8940 | if (PageDirty(page)) |
8941 | btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE); | ||
8937 | if (!inode_evicting) { | 8942 | if (!inode_evicting) { |
8938 | clear_extent_bit(tree, page_start, page_end, | 8943 | clear_extent_bit(tree, page_start, page_end, |
8939 | EXTENT_LOCKED | EXTENT_DIRTY | | 8944 | EXTENT_LOCKED | EXTENT_DIRTY | |