btrfs_repair_io_failure(fs_info, btrfs_ino(inode),
                                  repair_bbio->file_offset, fs_info->sectorsize,
                                  repair_bbio->saved_iter.bi_sector << SECTOR_SHIFT,
-                                 page_folio(bv->bv_page), bv->bv_offset, mirror);
+                                 bvec_phys(bv), mirror);
        } while (mirror != fbio->bbio->mirror_num);
 
 done:
  * freeing the bio.
  */
 int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
-                           u64 length, u64 logical, struct folio *folio,
-                           unsigned int folio_offset, int mirror_num)
+                           u64 length, u64 logical, phys_addr_t paddr, int mirror_num)
 {
        struct btrfs_io_stripe smap = { 0 };
        struct bio_vec bvec;
 
        bio_init(&bio, smap.dev->bdev, &bvec, 1, REQ_OP_WRITE | REQ_SYNC);
        bio.bi_iter.bi_sector = smap.physical >> SECTOR_SHIFT;
-       ret = bio_add_folio(&bio, folio, length, folio_offset);
-       ASSERT(ret);
+       __bio_add_page(&bio, phys_to_page(paddr), length, offset_in_page(paddr));
        ret = submit_bio_wait(&bio);
        if (ret) {
                /* try to remap that extent elsewhere? */
 
 void btrfs_submit_bbio(struct btrfs_bio *bbio, int mirror_num);
 void btrfs_submit_repair_write(struct btrfs_bio *bbio, int mirror_num, bool dev_replace);
 int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
-                           u64 length, u64 logical, struct folio *folio,
-                           unsigned int folio_offset, int mirror_num);
+                           u64 length, u64 logical, phys_addr_t paddr, int mirror_num);
 
 #endif
 
                u64 end = min_t(u64, eb->start + eb->len,
                                folio_pos(folio) + eb->folio_size);
                u32 len = end - start;
+               phys_addr_t paddr = PFN_PHYS(folio_pfn(folio)) +
+                                   offset_in_folio(folio, start);
 
-               ret = btrfs_repair_io_failure(fs_info, 0, start, len,
-                                             start, folio, offset_in_folio(folio, start),
-                                             mirror_num);
+               ret = btrfs_repair_io_failure(fs_info, 0, start, len, start,
+                                             paddr, mirror_num);
                if (ret)
                        break;
        }