--- 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); } /**