summaryrefslogtreecommitdiff
path: root/tests/xfs/600
blob: e6997c53d12070b9fa25ed83fbaf465ee1cab0e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2023 Oracle.  All Rights Reserved.
#
# FS QA Test No. 600
#
# Regression test for an agbno overflow bug in XFS GETFSMAP involving an
# fsmap_advance call.  Userspace can indicate that a GETFSMAP call is actually
# a continuation of a previous call by setting the "low" key to the last record
# returned by the previous call.
#
# If the last record returned by GETFSMAP is a non-shareable extent at the end
# of an AG and the AG size is exactly a power of two, the startblock in the low
# key of the rmapbt query can be set to a value larger than EOAG.  When this
# happens, GETFSMAP will return EINVAL instead of returning records for the
# next AG.
#
. ./common/preamble
_begin_fstest auto quick fsmap

. ./common/filter

_fixed_by_git_commit kernel cfa2df68b7ce \
	"xfs: fix an agbno overflow in __xfs_getfsmap_datadev"

# Modify as appropriate.
_supported_fs generic
_require_xfs_io_command fsmap
_require_xfs_scratch_rmapbt

_scratch_mkfs | _filter_mkfs 2> $tmp.mkfs >> $seqres.full
source $tmp.mkfs

# Find the next power of two agsize smaller than whatever the default is.
for ((p = 31; p > 0; p--)); do
	desired_agsize=$((2 ** p))
	test "$desired_agsize" -lt "$agsize" && break
done

echo "desired asize=$desired_agsize" >> $seqres.full
_scratch_mkfs -d "agsize=${desired_agsize}b" | _filter_mkfs 2> $tmp.mkfs >> $seqres.full
source $tmp.mkfs

test "$desired_agsize" -eq "$agsize" || _notrun "wanted agsize=$desired_agsize, got $agsize"

_scratch_mount
$XFS_IO_PROG -c 'fsmap -n 1024 -v' $SCRATCH_MNT >> $tmp.big
$XFS_IO_PROG -c 'fsmap -n 1 -v' $SCRATCH_MNT >> $tmp.small

diff -Naurpw $tmp.big $tmp.small

# success, all done
echo Silence is golden
status=0
exit