| From f2165627319ffd33a6217275e5690b1ab5c45763 Mon Sep 17 00:00:00 2001 |
| From: David Sterba <dsterba@suse.com> |
| Date: Mon, 14 Jun 2021 12:45:18 +0200 |
| Subject: btrfs: compression: don't try to compress if we don't have enough pages |
| |
| From: David Sterba <dsterba@suse.com> |
| |
| commit f2165627319ffd33a6217275e5690b1ab5c45763 upstream. |
| |
| The early check if we should attempt compression does not take into |
| account the number of input pages. It can happen that there's only one |
| page, eg. a tail page after some ranges of the BTRFS_MAX_UNCOMPRESSED |
| have been processed, or an isolated page that won't be converted to an |
| inline extent. |
| |
| The single page would be compressed but a later check would drop it |
| again because the result size must be at least one block shorter than |
| the input. That can never work with just one page. |
| |
| CC: stable@vger.kernel.org # 4.4+ |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/btrfs/inode.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/btrfs/inode.c |
| +++ b/fs/btrfs/inode.c |
| @@ -547,7 +547,7 @@ again: |
| * inode has not been flagged as nocompress. This flag can |
| * change at any time if we discover bad compression ratios. |
| */ |
| - if (inode_need_compress(BTRFS_I(inode), start, end)) { |
| + if (nr_pages > 1 && inode_need_compress(BTRFS_I(inode), start, end)) { |
| WARN_ON(pages); |
| pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS); |
| if (!pages) { |