]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: subpage: make end_compressed_bio_writeback() compatible
authorQu Wenruo <wqu@suse.com>
Mon, 27 Sep 2021 07:22:01 +0000 (15:22 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 26 Oct 2021 17:08:04 +0000 (19:08 +0200)
In end_compressed_writeback() we just clear the full page writeback.
For subpage case, if there are two delalloc ranges in the same page, the
2nd range will trigger a BUG_ON() as the page writeback is already
cleared by previous range.

Fix it by using btrfs_page_clamp_clear_writeback() helper.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c

index ab2eb936975fd18f45e68ce1efb2d5033443fb15..1d071c8d6fff803f08342512a0efb68d9f6a6848 100644 (file)
@@ -334,6 +334,7 @@ out:
 static noinline void end_compressed_writeback(struct inode *inode,
                                              const struct compressed_bio *cb)
 {
+       struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        unsigned long index = cb->start >> PAGE_SHIFT;
        unsigned long end_index = (cb->start + cb->len - 1) >> PAGE_SHIFT;
        struct page *pages[16];
@@ -356,7 +357,8 @@ static noinline void end_compressed_writeback(struct inode *inode,
                for (i = 0; i < ret; i++) {
                        if (cb->errors)
                                SetPageError(pages[i]);
-                       end_page_writeback(pages[i]);
+                       btrfs_page_clamp_clear_writeback(fs_info, pages[i],
+                                                        cb->start, cb->len);
                        put_page(pages[i]);
                }
                nr_pages -= ret;