xfs: fix partially uninitialized structure in xfs_reflink_remap_extent

In the reflink extent remap function, it turns out that uirec (the block
mapping corresponding only to the part of the passed-in mapping that got
unmapped) was not fully initialized.  Specifically, br_state was not
being copied from the passed-in struct to the uirec.  This could lead to
unpredictable results such as the reflinked mapping being marked
unwritten in the destination file.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
Darrick J. Wong 2020-04-12 13:11:11 -07:00
parent 4b674b9ac8
commit c142932c29

View File

@ -1051,6 +1051,7 @@ xfs_reflink_remap_extent(
uirec.br_startblock = irec->br_startblock + rlen; uirec.br_startblock = irec->br_startblock + rlen;
uirec.br_startoff = irec->br_startoff + rlen; uirec.br_startoff = irec->br_startoff + rlen;
uirec.br_blockcount = unmap_len - rlen; uirec.br_blockcount = unmap_len - rlen;
uirec.br_state = irec->br_state;
unmap_len = rlen; unmap_len = rlen;
/* If this isn't a real mapping, we're done. */ /* If this isn't a real mapping, we're done. */