1594
1595
1596
1597 nmap = 1;
1598 ASSERT(args->firstblock != NULL);
1599 if ((error = xfs_bmapi(tp, dp, bno, count,
1600 XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|XFS_BMAPI_METADATA|
1601 XFS_BMAPI_CONTIG,
1602 args->firstblock, args->total, &map, &nmap,
1603 args->flist, NULL))) {
1604 return error;
1605 }
1606 ASSERT(nmap <= 1);
1607 if (nmap == 1) {
1608 mapp = ↦
1609 mapi = 1;
1610 }
1611
1612
1613
1614
1615 else if (nmap == 0 && count > 1) {
1616 mapp = kmem_alloc(sizeof(*mapp) * count, KM_SLEEP);
1617 for (b = bno, mapi = 0; b < bno + count; ) {
1618 nmap = MIN(XFS_BMAP_MAX_NMAP, count);
1619 c = (int)(bno + count - b);
1620 if ((error = xfs_bmapi(tp, dp, b, c,
1621 XFS_BMAPI_AFLAG(w)|XFS_BMAPI_WRITE|
1622 XFS_BMAPI_METADATA,
1623 args->firstblock, args->total,
1624 &mapp[mapi], &nmap, args->flist,
1625 NULL))) {
1626 kmem_free(mapp);
1627 return error;
1628 }
1629 if (nmap < 1)
1630 break;
1631 mapi += nmap;
1632 b = mapp[mapi - 1].br_startoff +
1633 mapp[mapi - 1].br_blockcount;
1634 }