fsx: fix range overlap check
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 24 Dec 2019 04:41:06 +0000 (20:41 -0800)
committerEryu Guan <guaneryu@gmail.com>
Mon, 6 Jan 2020 09:52:57 +0000 (17:52 +0800)
On 32-bit systems, the offsets are 'unsigned long' (32-bit) which means
that we must cast the explicitly to unsigned long long before feeding
them to llabs.  Without the type conversion we fail to sign-extend the
llabs parameter, try to make a copy/clone/dedupe call with overlapping
ranges, and fsx aborts and the test fails.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
ltp/fsx.c

index 06d08e4e93f33d19f8bcae3e27a2e0e158990126..00001117910708264d788a178a0aed22c8522bbc 100644 (file)
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -1911,6 +1911,14 @@ fail:
        return 0;
 }
 
+static inline bool
+range_overlaps(
+       unsigned long   off0,
+       unsigned long   off1,
+       unsigned long   size)
+{
+       return llabs((unsigned long long)off1 - off0) < size;
+}
 
 int
 test(void)
@@ -1993,7 +2001,7 @@ test(void)
                        offset2 = random();
                        TRIM_OFF(offset2, maxfilelen);
                        offset2 = offset2 & ~(block_size - 1);
-               } while (llabs(offset2 - offset) < size ||
+               } while (range_overlaps(offset, offset2, size) ||
                         offset2 + size > maxfilelen);
                break;
        case OP_DEDUPE_RANGE:
@@ -2011,7 +2019,7 @@ test(void)
                                offset2 = random();
                                TRIM_OFF(offset2, file_size);
                                offset2 = offset2 & ~(block_size - 1);
-                       } while (llabs(offset2 - offset) < size ||
+                       } while (range_overlaps(offset, offset2, size) ||
                                 offset2 + size > file_size);
                        break;
                }
@@ -2024,7 +2032,7 @@ test(void)
                        offset2 = random();
                        TRIM_OFF(offset2, maxfilelen);
                        offset2 -= offset2 % writebdy;
-               } while (llabs(offset2 - offset) < size ||
+               } while (range_overlaps(offset, offset2, size) ||
                         offset2 + size > maxfilelen);
                break;
        }