blob: 42f022d553d2830966be97f484f4115e87fd4820 [file] [log] [blame]
/*
* Test program to trigger various ext4 ioctl's
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#if (!defined(EXT4_IOC_ALLOC_DA_BLKS) && defined(__linux__))
#define EXT4_IOC_ALLOC_DA_BLKS _IO('f', 12)
#endif
#if (!defined(EXT4_IOC_SWAP_BOOT) && defined(__linux__))
#define EXT4_IOC_SWAP_BOOT _IO('f', 17)
#endif
#if (!defined(EXT4_IOC_PRECACHE_EXTENTS) && defined(__linux__))
#define EXT4_IOC_PRECACHE_EXTENTS _IO('f', 18)
#endif
#if (!defined(EXT4_IOC_CLEAR_ES_CACHE) && defined(__linux__))
#define EXT4_IOC_CLEAR_ES_CACHE _IO('f', 40)
#endif
#define EXT4_F_RW 0x0001
struct cmd {
const char *cmd;
unsigned long ioc;
int flags;
};
struct cmd cmds[] = {
{ "alloc_da_blks", EXT4_IOC_ALLOC_DA_BLKS, EXT4_F_RW },
{ "precache", EXT4_IOC_PRECACHE_EXTENTS, 0 },
{ "swap_boot", EXT4_IOC_SWAP_BOOT, EXT4_F_RW },
{ "clear_es_cache", EXT4_IOC_CLEAR_ES_CACHE, EXT4_F_RW },
{ NULL, 0 }
};
const char *progname;
void usage()
{
struct cmd *p;
fprintf(stderr, "Usage: %s <cmd> <file>\n\n", progname);
fprintf(stderr, "Available commands:\n");
for (p = cmds; p->cmd; p++) {
fprintf(stderr, "\t%s\n", p->cmd);
}
exit(1);
}
int do_single_cmd(const char *fn, struct cmd *p)
{
int fd;
int oflags = O_RDONLY;
if (p->flags & EXT4_F_RW)
oflags = O_RDWR;
fd = open(fn, oflags, 0);
if (fd < 0) {
perror("open");
return 1;
}
if (ioctl(fd, p->ioc) < 0) {
perror("ioctl");
return 1;
}
close(fd);
return 0;
}
int main(int argc, char **argv)
{
int i, fails = 0;
struct cmd *p;
progname = argv[0];
if (argc < 3 || strcmp(argv[1], "help") == 0)
usage();
for (p = cmds; p->cmd; p++) {
if (strcmp(argv[1], p->cmd) == 0)
break;
}
if (p->cmd == NULL) {
fprintf(stderr, "Invalid command: %s\n", argv[1]);
usage();
}
for (i = 2; i < argc; i++)
fails += do_single_cmd(argv[i], p);
return fails;
}