generic/402: skip test if xfs_io can't parse the date value
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 4 Mar 2020 02:46:34 +0000 (18:46 -0800)
committerEryu Guan <guaneryu@gmail.com>
Sun, 8 Mar 2020 15:40:22 +0000 (23:40 +0800)
If xfs_io's utimes command cannot interpret the arguments that are
given to it, it will print out "Bad value for [am]time".  Detect
when this happens and drop the file out of the test entirely.

This is particularly noticeable on 32-bit platforms and the largest
timestamp seconds supported by the filesystem is INT_MAX.  In this
case, the maximum value we can cram into tv_sec is INT_MAX, and
there is no way to actually test setting a timestamp of INT_MAX + 1
to test the clamping.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Zorro Lang <zlang@redhat.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
tests/generic/402

index 2a34d127f44828e1e43fdcc63fb4fec801fe32ef..2481a5d246148946ce4db14f1b8f41ce00b09eb0 100755 (executable)
@@ -63,10 +63,26 @@ run_test_individual()
        # check if the time needs update
        if [ $update_time -eq 1 ]; then
                echo "Updating file: $file to timestamp $timestamp"  >> $seqres.full
        # check if the time needs update
        if [ $update_time -eq 1 ]; then
                echo "Updating file: $file to timestamp $timestamp"  >> $seqres.full
-               $XFS_IO_PROG -f -c "utimes $timestamp 0 $timestamp 0" $file
-               if [ $? -ne 0 ]; then
+               rm -f $tmp.utimes
+               $XFS_IO_PROG -f -c "utimes $timestamp 0 $timestamp 0" $file > $tmp.utimes 2>&1
+               local res=$?
+
+               cat $tmp.utimes >> $seqres.full
+               if [ "$timestamp" -ne 0 ] && grep -q "Bad value" "$tmp.utimes"; then
+                       echo "xfs_io could not interpret time value \"$timestamp\", skipping \"$file\" test." >> $seqres.full
+                       rm -f $file $tmp.utimes
+                       return
+               fi
+               cat $tmp.utimes
+               rm -f $tmp.utimes
+               if [ $res -ne 0 ]; then
                        echo "Failed to update times on $file" | tee -a $seqres.full
                fi
                        echo "Failed to update times on $file" | tee -a $seqres.full
                fi
+       else
+               if [ ! -f "$file" ]; then
+                       echo "xfs_io did not create file for time value \"$timestamp\", skipping test." >> $seqres.full
+                       return
+               fi
        fi
 
        tsclamp=$((timestamp<tsmin?tsmin:timestamp>tsmax?tsmax:timestamp))
        fi
 
        tsclamp=$((timestamp<tsmin?tsmin:timestamp>tsmax?tsmax:timestamp))