xfs: always succeed when deduping zero bytes
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 28 Nov 2016 03:57:42 +0000 (14:57 +1100)
committerDave Chinner <david@fromorbit.com>
Mon, 28 Nov 2016 03:57:42 +0000 (14:57 +1100)
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>
fs/xfs/xfs_reflink.c

index 56372bee08c534cfcae7aeb7b58437a6fc4372bf..c58371fde08def4c42e970788865bf625cfa60db 100644 (file)
@@ -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 ||