summaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_reflink.c
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2016-11-28 04:57:42 +0100
committerDave Chinner <david@fromorbit.com>2016-11-28 04:57:42 +0100
commitfba3e594ef0ad911fa8f559732d588172f212d71 (patch)
tree26091fceaa12422389c5ff5e53077de685b5b1cd /fs/xfs/xfs_reflink.c
parentfs: xfs: libxfs: constify xfs_nameops structures (diff)
downloadlinux-fba3e594ef0ad911fa8f559732d588172f212d71.tar.xz
linux-fba3e594ef0ad911fa8f559732d588172f212d71.zip
xfs: always succeed when deduping zero bytes
It turns out that btrfs and xfs had differing interpretations of what to do when the dedupe length is zero. Change xfs to follow btrfs' semantics so that the userland interface is consistent. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_reflink.c')
-rw-r--r--fs/xfs/xfs_reflink.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
index 56372bee08c5..c58371fde08d 100644
--- a/fs/xfs/xfs_reflink.c
+++ b/fs/xfs/xfs_reflink.c
@@ -1317,8 +1317,14 @@ xfs_reflink_remap_range(
goto out_unlock;
}
- if (len == 0)
+ /* Zero length dedupe exits immediately; reflink goes to EOF. */
+ if (len == 0) {
+ if (is_dedupe) {
+ ret = 0;
+ goto out_unlock;
+ }
len = isize - pos_in;
+ }
/* Ensure offsets don't wrap and the input is inside i_size */
if (pos_in + len < pos_in || pos_out + len < pos_out ||