Merge tag 'drm-next-2021-09-10' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / fs / btrfs / subpage.c
index 640bcd2..cb10e56 100644 (file)
@@ -435,8 +435,10 @@ void btrfs_subpage_clear_writeback(const struct btrfs_fs_info *fs_info,
 
        spin_lock_irqsave(&subpage->lock, flags);
        subpage->writeback_bitmap &= ~tmp;
-       if (subpage->writeback_bitmap == 0)
+       if (subpage->writeback_bitmap == 0) {
+               ASSERT(PageWriteback(page));
                end_page_writeback(page);
+       }
        spin_unlock_irqrestore(&subpage->lock, flags);
 }
 
@@ -559,3 +561,23 @@ IMPLEMENT_BTRFS_PAGE_OPS(writeback, set_page_writeback, end_page_writeback,
                         PageWriteback);
 IMPLEMENT_BTRFS_PAGE_OPS(ordered, SetPageOrdered, ClearPageOrdered,
                         PageOrdered);
+
+/*
+ * Make sure not only the page dirty bit is cleared, but also subpage dirty bit
+ * is cleared.
+ */
+void btrfs_page_assert_not_dirty(const struct btrfs_fs_info *fs_info,
+                                struct page *page)
+{
+       struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private;
+
+       if (!IS_ENABLED(CONFIG_BTRFS_ASSERT))
+               return;
+
+       ASSERT(!PageDirty(page));
+       if (fs_info->sectorsize == PAGE_SIZE)
+               return;
+
+       ASSERT(PagePrivate(page) && page->private);
+       ASSERT(subpage->dirty_bitmap == 0);
+}