xfs: iterate over extents in xfs_bmap_extents_to_btree
This actually makes the function very slightly less efficient for now as we detour through the expanded irect format between the in-core extent format and the on-disk one instead of just endian swapping them. But with the incore extent btree the in-core one will use a different format and the representation will be entirely hidden. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
71565f4b92
commit
906abed501
@ -667,14 +667,13 @@ xfs_bmap_extents_to_btree(
|
||||
xfs_bmbt_rec_t *arp; /* child record pointer */
|
||||
struct xfs_btree_block *block; /* btree root block */
|
||||
xfs_btree_cur_t *cur; /* bmap btree cursor */
|
||||
xfs_bmbt_rec_host_t *ep; /* extent record pointer */
|
||||
int error; /* error return value */
|
||||
xfs_extnum_t i, cnt; /* extent record index */
|
||||
xfs_ifork_t *ifp; /* inode fork pointer */
|
||||
xfs_bmbt_key_t *kp; /* root block key pointer */
|
||||
xfs_mount_t *mp; /* mount structure */
|
||||
xfs_extnum_t nextents; /* number of file extents */
|
||||
xfs_bmbt_ptr_t *pp; /* root block address pointer */
|
||||
struct xfs_bmbt_irec rec;
|
||||
xfs_extnum_t i = 0, cnt = 0;
|
||||
|
||||
mp = ip->i_mount;
|
||||
ASSERT(whichfork != XFS_COW_FORK);
|
||||
@ -753,15 +752,12 @@ xfs_bmap_extents_to_btree(
|
||||
XFS_BTNUM_BMAP, 0, 0, ip->i_ino,
|
||||
XFS_BTREE_LONG_PTRS);
|
||||
|
||||
arp = XFS_BMBT_REC_ADDR(mp, ablock, 1);
|
||||
nextents = xfs_iext_count(ifp);
|
||||
for (cnt = i = 0; i < nextents; i++) {
|
||||
ep = xfs_iext_get_ext(ifp, i);
|
||||
if (!isnullstartblock(xfs_bmbt_get_startblock(ep))) {
|
||||
arp->l0 = cpu_to_be64(ep->l0);
|
||||
arp->l1 = cpu_to_be64(ep->l1);
|
||||
arp++; cnt++;
|
||||
}
|
||||
while (xfs_iext_get_extent(ifp, i++, &rec)) {
|
||||
if (isnullstartblock(rec.br_startblock))
|
||||
continue;
|
||||
arp = XFS_BMBT_REC_ADDR(mp, ablock, 1 + cnt);
|
||||
xfs_bmbt_disk_set_all(arp, &rec);
|
||||
cnt++;
|
||||
}
|
||||
ASSERT(cnt == XFS_IFORK_NEXTENTS(ip, whichfork));
|
||||
xfs_btree_set_numrecs(ablock, cnt);
|
||||
|
Loading…
Reference in New Issue
Block a user