--- x/block/bdev.c
+++ y/block/bdev.c
@@ -707,9 +707,16 @@ static void bd_end_claim(struct block_de
 
 static void blkdev_flush_mapping(struct block_device *bdev)
 {
+	struct address_space *mapping = bdev->bd_mapping;
+
 	WARN_ON_ONCE(bdev->bd_holders);
 	sync_blockdev(bdev);
-	kill_bdev(bdev);
+	filemap_invalidate_lock(mapping);
+	if (!mapping_empty(mapping)) {
+		invalidate_bh_lrus();
+		truncate_inode_pages(mapping, 0);
+	}
+	filemap_invalidate_unlock(mapping);
 	bdev_write_inode(bdev);
 }
 
--- x/mm/gup.c
+++ y/mm/gup.c
@@ -105,17 +105,18 @@ retry:
 
 static void gup_put_folio(struct folio *folio, int refs, unsigned int flags)
 {
-	if (flags & FOLL_PIN) {
+	if (flags & FOLL_GET)
+		folio_put_refs(folio, refs);
+	else if (flags & FOLL_PIN) {
 		if (is_zero_folio(folio))
 			return;
 		node_stat_mod_folio(folio, NR_FOLL_PIN_RELEASED, refs);
-		if (folio_has_pincount(folio))
+		if (folio_has_pincount(folio)) {
 			atomic_sub(refs, &folio->_pincount);
-		else
+			folio_put_refs(folio, refs);
+		} else
 			refs *= GUP_PIN_COUNTING_BIAS;
 	}
-
-	folio_put_refs(folio, refs);
 }
 
 /**