}
 EXPORT_SYMBOL(folio_wait_private_2_killable);
 
+/*
+ * If folio was marked as dropbehind, then pages should be dropped when writeback
+ * completes. Do that now. If we fail, it's likely because of a big folio -
+ * just reset dropbehind for that case and latter completions should invalidate.
+ */
+static void folio_end_dropbehind_write(struct folio *folio)
+{
+       /*
+        * Hitting !in_task() should not happen off RWF_DONTCACHE writeback,
+        * but can happen if normal writeback just happens to find dirty folios
+        * that were created as part of uncached writeback, and that writeback
+        * would otherwise not need non-IRQ handling. Just skip the
+        * invalidation in that case.
+        */
+       if (in_task() && folio_trylock(folio)) {
+               if (folio->mapping)
+                       folio_unmap_invalidate(folio->mapping, folio, 0);
+               folio_unlock(folio);
+       }
+}
+
 /**
  * folio_end_writeback - End writeback against a folio.
  * @folio: The folio.
  */
 void folio_end_writeback(struct folio *folio)
 {
+       bool folio_dropbehind = false;
+
        VM_BUG_ON_FOLIO(!folio_test_writeback(folio), folio);
 
        /*
         * reused before the folio_wake_bit().
         */
        folio_get(folio);
+       if (!folio_test_dirty(folio))
+               folio_dropbehind = folio_test_clear_dropbehind(folio);
        if (__folio_end_writeback(folio))
                folio_wake_bit(folio, PG_writeback);
        acct_reclaim_writeback(folio);
+
+       if (folio_dropbehind)
+               folio_end_dropbehind_write(folio);
        folio_put(folio);
 }
 EXPORT_SYMBOL(folio_end_writeback);