xfs: fix data corruption w/ unaligned reflink ranges
authorDave Chinner <david@fromorbit.com>
Sat, 6 Oct 2018 01:44:39 +0000 (11:44 +1000)
committerDave Chinner <david@fromorbit.com>
Sat, 6 Oct 2018 01:44:39 +0000 (11:44 +1000)
commitb39989009bdb84992915c9869f58094ed5becf10
tree574f76831c2cd648c830512c18dabba768ac96eb
parentdceeb47b0ed65e14de53507a8a9c32a90831cfa1
xfs: fix data corruption w/ unaligned reflink ranges

When reflinking sub-file ranges, a data corruption can occur when
the source file range includes a partial EOF block. This shares the
unknown data beyond EOF into the second file at a position inside
EOF, exposing stale data in the second file.

XFS only supports whole block sharing, but we still need to
support whole file reflink correctly.  Hence if the reflink
request includes the last block of the souce file, only proceed with
the reflink operation if it lands at or past the destination file's
current EOF. If it lands within the destination file EOF, reject the
entire request with -EINVAL and make the caller go the hard way.

This avoids the data corruption vector, but also avoids disruption
of returning EINVAL to userspace for the common case of whole file
cloning.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_reflink.c