1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * Test program to trigger various ext4 ioctl's
3*6a54128fSAndroid Build Coastguard Worker */
4*6a54128fSAndroid Build Coastguard Worker
5*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
6*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
7*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
8*6a54128fSAndroid Build Coastguard Worker #include <string.h>
9*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
10*6a54128fSAndroid Build Coastguard Worker #include <sys/ioctl.h>
11*6a54128fSAndroid Build Coastguard Worker
12*6a54128fSAndroid Build Coastguard Worker #if (!defined(EXT4_IOC_ALLOC_DA_BLKS) && defined(__linux__))
13*6a54128fSAndroid Build Coastguard Worker #define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12)
14*6a54128fSAndroid Build Coastguard Worker #endif
15*6a54128fSAndroid Build Coastguard Worker
16*6a54128fSAndroid Build Coastguard Worker #if (!defined(EXT4_IOC_SWAP_BOOT) && defined(__linux__))
17*6a54128fSAndroid Build Coastguard Worker #define EXT4_IOC_SWAP_BOOT _IO('f', 17)
18*6a54128fSAndroid Build Coastguard Worker #endif
19*6a54128fSAndroid Build Coastguard Worker
20*6a54128fSAndroid Build Coastguard Worker #if (!defined(EXT4_IOC_PRECACHE_EXTENTS) && defined(__linux__))
21*6a54128fSAndroid Build Coastguard Worker #define EXT4_IOC_PRECACHE_EXTENTS _IO('f', 18)
22*6a54128fSAndroid Build Coastguard Worker #endif
23*6a54128fSAndroid Build Coastguard Worker
24*6a54128fSAndroid Build Coastguard Worker #if (!defined(EXT4_IOC_CLEAR_ES_CACHE) && defined(__linux__))
25*6a54128fSAndroid Build Coastguard Worker #define EXT4_IOC_CLEAR_ES_CACHE _IO('f', 40)
26*6a54128fSAndroid Build Coastguard Worker #endif
27*6a54128fSAndroid Build Coastguard Worker
28*6a54128fSAndroid Build Coastguard Worker
29*6a54128fSAndroid Build Coastguard Worker #define EXT4_F_RW 0x0001
30*6a54128fSAndroid Build Coastguard Worker
31*6a54128fSAndroid Build Coastguard Worker struct cmd {
32*6a54128fSAndroid Build Coastguard Worker const char *cmd;
33*6a54128fSAndroid Build Coastguard Worker unsigned long ioc;
34*6a54128fSAndroid Build Coastguard Worker int flags;
35*6a54128fSAndroid Build Coastguard Worker };
36*6a54128fSAndroid Build Coastguard Worker
37*6a54128fSAndroid Build Coastguard Worker struct cmd cmds[] = {
38*6a54128fSAndroid Build Coastguard Worker { "alloc_da_blks", EXT4_IOC_ALLOC_DA_BLKS, EXT4_F_RW },
39*6a54128fSAndroid Build Coastguard Worker { "precache", EXT4_IOC_PRECACHE_EXTENTS, 0 },
40*6a54128fSAndroid Build Coastguard Worker { "swap_boot", EXT4_IOC_SWAP_BOOT, EXT4_F_RW },
41*6a54128fSAndroid Build Coastguard Worker { "clear_es_cache", EXT4_IOC_CLEAR_ES_CACHE, EXT4_F_RW },
42*6a54128fSAndroid Build Coastguard Worker { NULL, 0 }
43*6a54128fSAndroid Build Coastguard Worker };
44*6a54128fSAndroid Build Coastguard Worker
45*6a54128fSAndroid Build Coastguard Worker const char *progname;
46*6a54128fSAndroid Build Coastguard Worker
usage()47*6a54128fSAndroid Build Coastguard Worker void usage()
48*6a54128fSAndroid Build Coastguard Worker {
49*6a54128fSAndroid Build Coastguard Worker struct cmd *p;
50*6a54128fSAndroid Build Coastguard Worker
51*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s <cmd> <file>\n\n", progname);
52*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, "Available commands:\n");
53*6a54128fSAndroid Build Coastguard Worker for (p = cmds; p->cmd; p++) {
54*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, "\t%s\n", p->cmd);
55*6a54128fSAndroid Build Coastguard Worker }
56*6a54128fSAndroid Build Coastguard Worker exit(1);
57*6a54128fSAndroid Build Coastguard Worker }
58*6a54128fSAndroid Build Coastguard Worker
do_single_cmd(const char * fn,struct cmd * p)59*6a54128fSAndroid Build Coastguard Worker int do_single_cmd(const char *fn, struct cmd *p)
60*6a54128fSAndroid Build Coastguard Worker {
61*6a54128fSAndroid Build Coastguard Worker int fd;
62*6a54128fSAndroid Build Coastguard Worker int oflags = O_RDONLY;
63*6a54128fSAndroid Build Coastguard Worker
64*6a54128fSAndroid Build Coastguard Worker if (p->flags & EXT4_F_RW)
65*6a54128fSAndroid Build Coastguard Worker oflags = O_RDWR;
66*6a54128fSAndroid Build Coastguard Worker fd = open(fn, oflags, 0);
67*6a54128fSAndroid Build Coastguard Worker if (fd < 0) {
68*6a54128fSAndroid Build Coastguard Worker perror("open");
69*6a54128fSAndroid Build Coastguard Worker return 1;
70*6a54128fSAndroid Build Coastguard Worker }
71*6a54128fSAndroid Build Coastguard Worker if (ioctl(fd, p->ioc) < 0) {
72*6a54128fSAndroid Build Coastguard Worker perror("ioctl");
73*6a54128fSAndroid Build Coastguard Worker return 1;
74*6a54128fSAndroid Build Coastguard Worker }
75*6a54128fSAndroid Build Coastguard Worker close(fd);
76*6a54128fSAndroid Build Coastguard Worker return 0;
77*6a54128fSAndroid Build Coastguard Worker }
78*6a54128fSAndroid Build Coastguard Worker
main(int argc,char ** argv)79*6a54128fSAndroid Build Coastguard Worker int main(int argc, char **argv)
80*6a54128fSAndroid Build Coastguard Worker {
81*6a54128fSAndroid Build Coastguard Worker int i, fails = 0;
82*6a54128fSAndroid Build Coastguard Worker struct cmd *p;
83*6a54128fSAndroid Build Coastguard Worker
84*6a54128fSAndroid Build Coastguard Worker progname = argv[0];
85*6a54128fSAndroid Build Coastguard Worker if (argc < 3 || strcmp(argv[1], "help") == 0)
86*6a54128fSAndroid Build Coastguard Worker usage();
87*6a54128fSAndroid Build Coastguard Worker for (p = cmds; p->cmd; p++) {
88*6a54128fSAndroid Build Coastguard Worker if (strcmp(argv[1], p->cmd) == 0)
89*6a54128fSAndroid Build Coastguard Worker break;
90*6a54128fSAndroid Build Coastguard Worker }
91*6a54128fSAndroid Build Coastguard Worker if (p->cmd == NULL) {
92*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, "Invalid command: %s\n", argv[1]);
93*6a54128fSAndroid Build Coastguard Worker usage();
94*6a54128fSAndroid Build Coastguard Worker }
95*6a54128fSAndroid Build Coastguard Worker for (i = 2; i < argc; i++)
96*6a54128fSAndroid Build Coastguard Worker fails += do_single_cmd(argv[i], p);
97*6a54128fSAndroid Build Coastguard Worker return fails;
98*6a54128fSAndroid Build Coastguard Worker }
99