Skip to content

Commit 6f306e8

Browse files
committed
btrfs-progs: tests: make the ioctl-test actually useful
Enhance the test to verify ioctl uniqueness, compare the defined values against the hardcoded expected values, and take care of the 32bit/64bit compatibility workarounds. Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 32a1686 commit 6f306e8

File tree

2 files changed

+266
-30
lines changed

2 files changed

+266
-30
lines changed

Makefile.in

+24-3
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,30 @@ quick-test: $(objects) $(libs) quick-test.o
392392
@echo " [LD] $@"
393393
$(Q)$(CC) $(CFLAGS) -o quick-test $(objects) $(libs) quick-test.o $(LDFLAGS) $(LIBS)
394394

395-
ioctl-test: $(objects) $(libs) ioctl-test.o
396-
@echo " [LD] $@"
397-
$(Q)$(CC) $(CFLAGS) -o ioctl-test $(objects) $(libs) ioctl-test.o $(LDFLAGS) $(LIBS)
395+
ioctl-test-32.o: ioctl-test.c ioctl.h kerncompat.h ctree.h
396+
@echo " [CC32] $@"
397+
$(Q)$(CC) $(CFLAGS) -m32 -c $< -o $@
398+
399+
ioctl-test-64.o: ioctl-test.c ioctl.h kerncompat.h ctree.h
400+
@echo " [CC64] $@"
401+
$(Q)$(CC) $(CFLAGS) -m64 -c $< -o $@
402+
403+
ioctl-test-32: ioctl-test-32.o
404+
@echo " [LD32] $@"
405+
$(Q)$(CC) $(CFLAGS) -m32 -o $@ $< $(LDFLAGS)
406+
@echo " ?[PAHOLE] $@.pahole"
407+
-$(Q)pahole $@ > $@.pahole
408+
409+
ioctl-test-64: ioctl-test-64.o
410+
@echo " [LD64] $@"
411+
$(Q)$(CC) $(CFLAGS) -m64 -o $@ $< $(LDFLAGS)
412+
@echo " ?[PAHOLE] $@.pahole"
413+
-$(Q)pahole $@ > $@.pahole
414+
415+
test-ioctl: ioctl-test-32 ioctl-test-64
416+
@echo " [TEST/ioctl]"
417+
$(Q)./ioctl-test-32 > ioctl-test-32.log
418+
$(Q)./ioctl-test-64 > ioctl-test-64.log
398419

399420
send-test: $(objects) $(libs) send-test.o
400421
@echo " [LD] $@"

ioctl-test.c

+242-27
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,252 @@
1+
/*
2+
* This program is free software; you can redistribute it and/or
3+
* modify it under the terms of the GNU General Public
4+
* License v2 as published by the Free Software Foundation.
5+
*
6+
* This program is distributed in the hope that it will be useful,
7+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
8+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9+
* General Public License for more details.
10+
*
11+
* You should have received a copy of the GNU General Public
12+
* License along with this program; if not, write to the
13+
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
14+
* Boston, MA 021110-1307, USA.
15+
*/
16+
17+
#include "kerncompat.h"
118
#include <stdio.h>
219
#include <stdlib.h>
3-
#include "kerncompat.h"
20+
421
#include "ioctl.h"
22+
#include "ctree.h"
23+
24+
#define LIST_32_COMPAT \
25+
ONE(BTRFS_IOC_SET_RECEIVED_SUBVOL_32)
26+
27+
#define LIST_64_COMPAT \
28+
ONE(BTRFS_IOC_SEND_64)
29+
30+
#define LIST_BASE \
31+
ONE(BTRFS_IOC_SNAP_CREATE) \
32+
ONE(BTRFS_IOC_DEFRAG) \
33+
ONE(BTRFS_IOC_RESIZE) \
34+
ONE(BTRFS_IOC_SCAN_DEV) \
35+
ONE(BTRFS_IOC_TRANS_START) \
36+
ONE(BTRFS_IOC_TRANS_END) \
37+
ONE(BTRFS_IOC_SYNC) \
38+
ONE(BTRFS_IOC_CLONE) \
39+
ONE(BTRFS_IOC_ADD_DEV) \
40+
ONE(BTRFS_IOC_RM_DEV) \
41+
ONE(BTRFS_IOC_BALANCE) \
42+
ONE(BTRFS_IOC_CLONE_RANGE) \
43+
ONE(BTRFS_IOC_SUBVOL_CREATE) \
44+
ONE(BTRFS_IOC_SNAP_DESTROY) \
45+
ONE(BTRFS_IOC_DEFRAG_RANGE) \
46+
ONE(BTRFS_IOC_TREE_SEARCH) \
47+
ONE(BTRFS_IOC_TREE_SEARCH_V2) \
48+
ONE(BTRFS_IOC_INO_LOOKUP) \
49+
ONE(BTRFS_IOC_DEFAULT_SUBVOL) \
50+
ONE(BTRFS_IOC_SPACE_INFO) \
51+
ONE(BTRFS_IOC_START_SYNC) \
52+
ONE(BTRFS_IOC_WAIT_SYNC) \
53+
ONE(BTRFS_IOC_SNAP_CREATE_V2) \
54+
ONE(BTRFS_IOC_SUBVOL_CREATE_V2) \
55+
ONE(BTRFS_IOC_SUBVOL_GETFLAGS) \
56+
ONE(BTRFS_IOC_SUBVOL_SETFLAGS) \
57+
ONE(BTRFS_IOC_SCRUB) \
58+
ONE(BTRFS_IOC_SCRUB_CANCEL) \
59+
ONE(BTRFS_IOC_SCRUB_PROGRESS) \
60+
ONE(BTRFS_IOC_DEV_INFO) \
61+
ONE(BTRFS_IOC_FS_INFO) \
62+
ONE(BTRFS_IOC_BALANCE_V2) \
63+
ONE(BTRFS_IOC_BALANCE_CTL) \
64+
ONE(BTRFS_IOC_BALANCE_PROGRESS) \
65+
ONE(BTRFS_IOC_INO_PATHS) \
66+
ONE(BTRFS_IOC_LOGICAL_INO) \
67+
ONE(BTRFS_IOC_SET_RECEIVED_SUBVOL) \
68+
ONE(BTRFS_IOC_SEND) \
69+
ONE(BTRFS_IOC_DEVICES_READY) \
70+
ONE(BTRFS_IOC_QUOTA_CTL) \
71+
ONE(BTRFS_IOC_QGROUP_ASSIGN) \
72+
ONE(BTRFS_IOC_QGROUP_CREATE) \
73+
ONE(BTRFS_IOC_QGROUP_LIMIT) \
74+
ONE(BTRFS_IOC_QUOTA_RESCAN) \
75+
ONE(BTRFS_IOC_QUOTA_RESCAN_STATUS) \
76+
ONE(BTRFS_IOC_QUOTA_RESCAN_WAIT) \
77+
ONE(BTRFS_IOC_GET_FSLABEL) \
78+
ONE(BTRFS_IOC_SET_FSLABEL) \
79+
ONE(BTRFS_IOC_GET_DEV_STATS) \
80+
ONE(BTRFS_IOC_DEV_REPLACE) \
81+
ONE(BTRFS_IOC_FILE_EXTENT_SAME) \
82+
ONE(BTRFS_IOC_GET_FEATURES) \
83+
ONE(BTRFS_IOC_SET_FEATURES) \
84+
ONE(BTRFS_IOC_GET_SUPPORTED_FEATURES) \
85+
ONE(BTRFS_IOC_RM_DEV_V2)
586

6-
static unsigned long ioctls[] = {
7-
BTRFS_IOC_SNAP_CREATE,
8-
BTRFS_IOC_DEFRAG,
9-
BTRFS_IOC_RESIZE,
10-
BTRFS_IOC_SCAN_DEV,
11-
BTRFS_IOC_TRANS_START,
12-
BTRFS_IOC_TRANS_END,
13-
BTRFS_IOC_SYNC,
14-
BTRFS_IOC_CLONE,
15-
BTRFS_IOC_ADD_DEV,
16-
BTRFS_IOC_RM_DEV,
17-
BTRFS_IOC_BALANCE,
18-
BTRFS_IOC_SUBVOL_CREATE,
19-
BTRFS_IOC_SNAP_DESTROY,
20-
BTRFS_IOC_DEFRAG_RANGE,
21-
BTRFS_IOC_TREE_SEARCH,
22-
BTRFS_IOC_INO_LOOKUP,
23-
BTRFS_IOC_DEFAULT_SUBVOL,
24-
BTRFS_IOC_SPACE_INFO,
25-
BTRFS_IOC_SNAP_CREATE_V2,
26-
0 };
87+
#define LIST \
88+
LIST_BASE \
89+
LIST_32_COMPAT \
90+
LIST_64_COMPAT
91+
92+
struct ioctl_number {
93+
unsigned long defined;
94+
unsigned long expected;
95+
};
96+
97+
static struct ioctl_number expected_list[] = {
98+
{ BTRFS_IOC_SNAP_CREATE, 0x0050009401 },
99+
{ BTRFS_IOC_DEFRAG, 0x0050009402 },
100+
{ BTRFS_IOC_RESIZE, 0x0050009403 },
101+
{ BTRFS_IOC_SCAN_DEV, 0x0050009404 },
102+
{ BTRFS_IOC_TRANS_START, 0x0000009406 },
103+
{ BTRFS_IOC_TRANS_END, 0x0000009407 },
104+
{ BTRFS_IOC_SYNC, 0x0000009408 },
105+
{ BTRFS_IOC_CLONE, 0x0040049409 },
106+
{ BTRFS_IOC_ADD_DEV, 0x005000940a },
107+
{ BTRFS_IOC_RM_DEV, 0x005000940b },
108+
{ BTRFS_IOC_BALANCE, 0x005000940c },
109+
{ BTRFS_IOC_CLONE_RANGE, 0x004020940d },
110+
{ BTRFS_IOC_SUBVOL_CREATE, 0x005000940e },
111+
{ BTRFS_IOC_SNAP_DESTROY, 0x005000940f },
112+
{ BTRFS_IOC_DEFRAG_RANGE, 0x0040309410 },
113+
{ BTRFS_IOC_TREE_SEARCH, 0x00d0009411 },
114+
{ BTRFS_IOC_TREE_SEARCH_V2, 0x00c0709411 },
115+
{ BTRFS_IOC_INO_LOOKUP, 0x00d0009412 },
116+
{ BTRFS_IOC_DEFAULT_SUBVOL, 0x0040089413 },
117+
{ BTRFS_IOC_SPACE_INFO, 0x00c0109414 },
118+
{ BTRFS_IOC_START_SYNC, 0x0080089418 },
119+
{ BTRFS_IOC_WAIT_SYNC, 0x0040089416 },
120+
{ BTRFS_IOC_SNAP_CREATE_V2, 0x0050009417 },
121+
{ BTRFS_IOC_SUBVOL_CREATE_V2, 0x0050009418 },
122+
{ BTRFS_IOC_SUBVOL_GETFLAGS, 0x0080089419 },
123+
{ BTRFS_IOC_SUBVOL_SETFLAGS, 0x004008941a },
124+
{ BTRFS_IOC_SCRUB, 0x00c400941b },
125+
{ BTRFS_IOC_SCRUB_CANCEL, 0x000000941c },
126+
{ BTRFS_IOC_SCRUB_PROGRESS, 0x00c400941d },
127+
{ BTRFS_IOC_DEV_INFO, 0x00d000941e },
128+
{ BTRFS_IOC_FS_INFO, 0x008400941f },
129+
{ BTRFS_IOC_BALANCE_V2, 0x00c4009420 },
130+
{ BTRFS_IOC_BALANCE_CTL, 0x0040049421 },
131+
{ BTRFS_IOC_BALANCE_PROGRESS, 0x0084009422 },
132+
{ BTRFS_IOC_INO_PATHS, 0x00c0389423 },
133+
{ BTRFS_IOC_LOGICAL_INO, 0x00c0389424 },
134+
{ BTRFS_IOC_SET_RECEIVED_SUBVOL, 0x00c0c89425 },
135+
#ifdef BTRFS_IOC_SET_RECEIVED_SUBVOL_32_COMPAT_DEFINED
136+
{ BTRFS_IOC_SET_RECEIVED_SUBVOL_32, 0x00c0c09425 },
137+
#endif
138+
#if BITS_PER_LONG == 32
139+
{ BTRFS_IOC_SEND, 0x0040449426 },
140+
#elif BITS_PER_LONG == 64
141+
{ BTRFS_IOC_SEND, 0x0040489426 },
142+
#endif
143+
#ifdef BTRFS_IOC_SEND_64_COMPAT_DEFINED
144+
{ BTRFS_IOC_SEND_64, 0x0040489426 },
145+
#endif
146+
{ BTRFS_IOC_DEVICES_READY, 0x0090009427 },
147+
{ BTRFS_IOC_QUOTA_CTL, 0x00c0109428 },
148+
{ BTRFS_IOC_QGROUP_ASSIGN, 0x0040189429 },
149+
{ BTRFS_IOC_QGROUP_CREATE, 0x004010942a },
150+
{ BTRFS_IOC_QGROUP_LIMIT, 0x008030942b },
151+
{ BTRFS_IOC_QUOTA_RESCAN, 0x004040942c },
152+
{ BTRFS_IOC_QUOTA_RESCAN_STATUS, 0x008040942d },
153+
{ BTRFS_IOC_QUOTA_RESCAN_WAIT, 0x000000942e },
154+
{ BTRFS_IOC_GET_FSLABEL, 0x0081009431 },
155+
{ BTRFS_IOC_SET_FSLABEL, 0x0041009432 },
156+
{ BTRFS_IOC_GET_DEV_STATS, 0x00c4089434 },
157+
{ BTRFS_IOC_DEV_REPLACE, 0x00ca289435 },
158+
{ BTRFS_IOC_FILE_EXTENT_SAME, 0x00c0189436 },
159+
{ BTRFS_IOC_GET_FEATURES, 0x0080189439 },
160+
{ BTRFS_IOC_SET_FEATURES, 0x0040309439 },
161+
{ BTRFS_IOC_GET_SUPPORTED_FEATURES, 0x0080489439 },
162+
{ BTRFS_IOC_RM_DEV_V2, 0x005000943a },
163+
};
164+
165+
static struct btrfs_ioctl_vol_args used_vol_args __attribute__((used));
166+
static struct btrfs_ioctl_vol_args_v2 used_vol_args2 __attribute__((used));
167+
static struct btrfs_ioctl_clone_range_args used_clone_args __attribute__((used));
168+
static struct btrfs_ioctl_defrag_range_args used_defrag_args __attribute__((used));
169+
static struct btrfs_ioctl_search_args used_search_args __attribute__((used));
170+
static struct btrfs_ioctl_search_args_v2 used_search_args2 __attribute__((used));
171+
static struct btrfs_ioctl_ino_lookup_args used_ino_lookup __attribute__((used));
172+
static struct btrfs_ioctl_space_args used_space_args __attribute__((used));
173+
static struct btrfs_ioctl_scrub_args used_scrub_args __attribute__((used));
174+
static struct btrfs_ioctl_dev_info_args used_dev_info_args __attribute__((used));
175+
static struct btrfs_ioctl_fs_info_args used_fs_info_args __attribute__((used));
176+
static struct btrfs_ioctl_balance_args used_balance_args __attribute__((used));
177+
static struct btrfs_ioctl_ino_path_args used_path_args __attribute__((used));
178+
static struct btrfs_ioctl_logical_ino_args used_logical_args __attribute__((used));
179+
static struct btrfs_ioctl_received_subvol_args used_received_args __attribute__((used));
180+
#ifdef BTRFS_IOC_SET_RECEIVED_SUBVOL_32_COMPAT_DEFINED
181+
static struct btrfs_ioctl_received_subvol_args_32 used_received_args32 __attribute__((used));
182+
#endif
183+
static struct btrfs_ioctl_send_args used_send_args __attribute__((used));
184+
#ifdef BTRFS_IOC_SEND_64_COMPAT_DEFINED
185+
static struct btrfs_ioctl_send_args_64 used_send_args64 __attribute__((used));
186+
#endif
187+
static struct btrfs_ioctl_quota_ctl_args used_qgctl_args __attribute__((used));
188+
static struct btrfs_ioctl_qgroup_assign_args used_qgassign_args __attribute__((used));
189+
static struct btrfs_ioctl_qgroup_create_args used_qgcreate_args __attribute__((used));
190+
static struct btrfs_ioctl_qgroup_limit_args used_qglimit_args __attribute__((used));
191+
static struct btrfs_ioctl_quota_rescan_args used_qgrescan_args __attribute__((used));
192+
static struct btrfs_ioctl_get_dev_stats used_dev_stats_args __attribute__((used));
193+
static struct btrfs_ioctl_dev_replace_args used_replace_args __attribute__((used));
194+
static struct btrfs_ioctl_same_args used_same_args __attribute__((used));
195+
static struct btrfs_ioctl_feature_flags used_feature_flags __attribute__((used));
196+
197+
const char* value_to_string(unsigned long num)
198+
{
199+
#define ONE(x) case x: return #x;
200+
switch (num) {
201+
LIST_BASE
202+
}
203+
204+
switch (num) {
205+
LIST_32_COMPAT
206+
}
207+
208+
switch (num) {
209+
LIST_64_COMPAT
210+
}
211+
#undef ONE
212+
return "UNKNOWN";
213+
}
27214

28215
int main(int ac, char **av)
29216
{
30-
int i = 0;
31-
while(ioctls[i]) {
32-
printf("%lu\n" ,ioctls[i]);
33-
i++;
217+
int i;
218+
int errors = 0;
219+
220+
value_to_string(random());
221+
222+
printf("Sizeof long long: %zu\n", sizeof(unsigned long long));
223+
printf("Sizeof long: %zu\n", sizeof(unsigned long));
224+
printf("Sizeof pointer: %zu\n", sizeof(void*));
225+
printf("Alignof long long: %zu\n", __alignof__(unsigned long long));
226+
printf("Alignof long: %zu\n", __alignof__(unsigned long));
227+
printf("Alignof pointer: %zu\n", __alignof__(void*));
228+
printf("Raw ioctl numbers:\n");
229+
230+
#define ONE(n) printf("%-38s 0x%010lx\n", #n, (unsigned long)n);
231+
LIST
232+
#undef ONE
233+
234+
for (i = 0; i < ARRAY_SIZE(expected_list); i++) {
235+
if (expected_list[i].defined != expected_list[i].expected) {
236+
printf("ERROR: wrong value for %s, defined=0x%lx expected=0x%lx\n",
237+
value_to_string(expected_list[i].defined),
238+
expected_list[i].defined,
239+
expected_list[i].expected);
240+
errors++;
241+
}
34242
}
35-
return 0;
243+
244+
if (!errors) {
245+
printf("All ok\n");
246+
} else {
247+
printf("Found %d errors in definitions\n", errors);
248+
}
249+
250+
return !!errors;
36251
}
37252

0 commit comments

Comments
 (0)