1552
1553
1554
1555
1556 if (qip->i_d.di_nblocks == 0)
1557 return 0;
1558
1559 map = kmem_alloc(XFS_DQITER_MAP_SIZE * sizeof(*map), KM_SLEEP);
1560
1561 lblkno = 0;
1562 maxlblkcnt = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_MAXIOFFSET(mp));
1563 do {
1564 nmaps = XFS_DQITER_MAP_SIZE;
1565
1566
1567
1568
1569
1570 xfs_ilock(qip, XFS_ILOCK_SHARED);
1571 error = xfs_bmapi(NULL, qip, lblkno,
1572 maxlblkcnt - lblkno,
1573 XFS_BMAPI_METADATA,
1574 NULL,
1575 0, map, &nmaps, NULL, NULL);
1576 xfs_iunlock(qip, XFS_ILOCK_SHARED);
1577 if (error)
1578 break;
1579
1580 ASSERT(nmaps <= XFS_DQITER_MAP_SIZE);
1581 for (i = 0; i < nmaps; i++) {
1582 ASSERT(map[i].br_startblock != DELAYSTARTBLOCK);
1583 ASSERT(map[i].br_blockcount);
1584
1585
1586 lblkno += map[i].br_blockcount;
1587
1588 if (map[i].br_startblock == HOLESTARTBLOCK)
1589 continue;
1590
1591 firstid = (xfs_dqid_t) map[i].br_startoff *
1592 XFS_QM_DQPERBLK(mp);