Christoph Hellwig <hch@xxxxxxxxxxxxx> wrote: > It can't. Per your latest branch: Yes it can. Patch 6: --- a/block/blk-map.c +++ b/block/blk-map.c @@ -282,6 +282,7 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter, if (blk_queue_pci_p2pdma(rq->q)) extract_flags |= ITER_ALLOW_P2PDMA; + bio_set_flag(bio, BIO_PAGE_REFFED); while (iov_iter_count(iter)) { struct page **pages, *stack_pages[UIO_FASTIOV]; ssize_t bytes; Patch 7: +static inline unsigned int bio_to_gup_flags(struct bio *bio) +{ + return (bio_flagged(bio, BIO_PAGE_REFFED) ? FOLL_GET : 0) | + (bio_flagged(bio, BIO_PAGE_PINNED) ? FOLL_PIN : 0); +} + +/* + * Clean up a page appropriately, where the page may be pinned, may have a + * ref taken on it or neither. + */ +static inline void bio_release_page(struct bio *bio, struct page *page) +{ + page_put_unpin(page, bio_to_gup_flags(bio)); +} At patch 8, you can get either FOLL_GET, FOLL_PIN or 0, depending on the path you go through. David