This really does three things: 1) add the BIO_PAGE_PINNED infrastructure 2) convert bio_iov_iter_get_pages to use iov_iter_extract_pages 3) convert bio_map_user_iov to use iov_iter_extract_pages so it should be three pages, with the first one also containing what is in your previous patch. > @@ -1183,7 +1185,7 @@ void __bio_release_pages(struct bio *bio, bool mark_dirty) > bio_for_each_segment_all(bvec, bio, iter_all) { > if (mark_dirty && !PageCompound(bvec->bv_page)) > set_page_dirty_lock(bvec->bv_page); > - put_page(bvec->bv_page); > + bio_release_page(bio, bvec->bv_page); This can be micro-optimized a bit by only doing the flags conversion once.