X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=kernel%2Ffs%2Fbtrfs%2Finode.c;fp=kernel%2Ffs%2Fbtrfs%2Finode.c;h=3cff6523f27d57590a5ab4c29422614acb8e13aa;hb=52f993b8e89487ec9ee15a7fb4979e0f09a45b27;hp=4bc9dbf29a73fbde861d9a8cab06db3876c8bf20;hpb=c189ccac5702322ed843fe17057035b7222a59b6;p=kvmfornfv.git diff --git a/kernel/fs/btrfs/inode.c b/kernel/fs/btrfs/inode.c index 4bc9dbf29..3cff6523f 100644 --- a/kernel/fs/btrfs/inode.c +++ b/kernel/fs/btrfs/inode.c @@ -8691,9 +8691,14 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, * So even we call qgroup_free_data(), it won't decrease reserved * space. * 2) Not written to disk - * This means the reserved space should be freed here. + * This means the reserved space should be freed here. However, + * if a truncate invalidates the page (by clearing PageDirty) + * and the page is accounted for while allocating extent + * in btrfs_check_data_free_space() we let delayed_ref to + * free the entire extent. */ - btrfs_qgroup_free_data(inode, page_start, PAGE_CACHE_SIZE); + if (PageDirty(page)) + btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE); if (!inode_evicting) { clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED | EXTENT_DIRTY |