*/
 static blk_status_t dio_bio_complete(struct dio *dio, struct bio *bio)
 {
-       struct bio_vec *bvec;
        blk_status_t err = bio->bi_status;
+       bool should_dirty = dio->op == REQ_OP_READ && dio->should_dirty;
 
        if (err) {
                if (err == BLK_STS_AGAIN && (bio->bi_opf & REQ_NOWAIT))
                        dio->io_error = -EIO;
        }
 
-       if (dio->is_async && dio->op == REQ_OP_READ && dio->should_dirty) {
+       if (dio->is_async && should_dirty) {
                bio_check_pages_dirty(bio);     /* transfers ownership */
        } else {
-               struct bvec_iter_all iter_all;
-
-               bio_for_each_segment_all(bvec, bio, iter_all) {
-                       struct page *page = bvec->bv_page;
-
-                       if (dio->op == REQ_OP_READ && !PageCompound(page) &&
-                                       dio->should_dirty)
-                               set_page_dirty_lock(page);
-                       put_page(page);
-               }
+               bio_release_pages(bio, should_dirty);
                bio_put(bio);
        }
        return err;