xfs_extlen_t aglen;
xfs_agblock_t rbno;
xfs_extlen_t rlen;
- struct xfs_bmbt_irec map[2];
+ struct xfs_bmbt_irec map;
int nmaps;
int error = 0;
* Look for extents in the file. Skip holes, delalloc, or
* unwritten extents; they can't be reflinked.
*/
- error = xfs_bmapi_read(ip, fbno, end - fbno, map, &nmaps, 0);
+ error = xfs_bmapi_read(ip, fbno, end - fbno, &map, &nmaps, 0);
if (error)
return error;
if (nmaps == 0)
break;
- if (map[0].br_startblock == HOLESTARTBLOCK ||
- map[0].br_startblock == DELAYSTARTBLOCK ||
- ISUNWRITTEN(&map[0]))
+ if (map.br_startblock == HOLESTARTBLOCK ||
+ map.br_startblock == DELAYSTARTBLOCK ||
+ ISUNWRITTEN(&map))
goto next;
- map[1] = map[0];
- while (map[1].br_blockcount) {
- agno = XFS_FSB_TO_AGNO(mp, map[1].br_startblock);
- agbno = XFS_FSB_TO_AGBNO(mp, map[1].br_startblock);
- aglen = map[1].br_blockcount;
-
- error = xfs_reflink_find_shared(mp, agno, agbno, aglen,
- &rbno, &rlen, false);
- if (error)
- return error;
- /* Is there still a shared block here? */
- if (rbno != NULLAGBLOCK)
- return 0;
-
- map[1].br_blockcount -= aglen;
- map[1].br_startoff += aglen;
- map[1].br_startblock += aglen;
- }
+ agno = XFS_FSB_TO_AGNO(mp, map.br_startblock);
+ agbno = XFS_FSB_TO_AGBNO(mp, map.br_startblock);
+ aglen = map.br_blockcount;
+ error = xfs_reflink_find_shared(mp, agno, agbno, aglen,
+ &rbno, &rlen, false);
+ if (error)
+ return error;
+ /* Is there still a shared block here? */
+ if (rbno != NULLAGBLOCK)
+ return 0;
next:
- fbno = map[0].br_startoff + map[0].br_blockcount;
+ fbno = map.br_startoff + map.br_blockcount;
}
/*