if (wpc->ioend)
                        list_add(&wpc->ioend->io_list, iolist);
                wpc->ioend = xfs_alloc_ioend(inode, wpc->fork,
-                               wpc->imap.br_state, offset, bdev, sector);
+                               wpc->imap.br_state, offset, bdev, sector, wbc);
        }
  
 -      if (!__bio_try_merge_page(wpc->ioend->io_bio, page, len, poff, true)) {
 -              if (iop)
 -                      atomic_inc(&iop->write_count);
 -              if (bio_full(wpc->ioend->io_bio))
 +      merged = __bio_try_merge_page(wpc->ioend->io_bio, page, len, poff,
 +                      &same_page);
 +
 +      if (iop && !same_page)
 +              atomic_inc(&iop->write_count);
 +
 +      if (!merged) {
 +              if (bio_full(wpc->ioend->io_bio, len))
-                       xfs_chain_bio(wpc->ioend, wbc, bdev, sector);
+                       wpc->ioend->io_bio = xfs_chain_bio(wpc->ioend->io_bio);
                bio_add_page(wpc->ioend->io_bio, page, len, poff);
        }