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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
#include <linux/ioctl.h>
#include <linux/dm-ioctl.h>
#include "shm.h"
#include "maps.h"
#include "utils.h"
#include "ioctls.h"
#include "random.h"
static const struct ioctl dm_ioctls[] = {
IOCTL(DM_VERSION),
IOCTL(DM_REMOVE_ALL),
IOCTL(DM_LIST_DEVICES),
IOCTL(DM_DEV_CREATE),
IOCTL(DM_DEV_REMOVE),
IOCTL(DM_DEV_RENAME),
IOCTL(DM_DEV_SUSPEND),
IOCTL(DM_DEV_STATUS),
IOCTL(DM_DEV_WAIT),
IOCTL(DM_TABLE_LOAD),
IOCTL(DM_TABLE_CLEAR),
IOCTL(DM_TABLE_DEPS),
IOCTL(DM_TABLE_STATUS),
IOCTL(DM_LIST_VERSIONS),
IOCTL(DM_TARGET_MSG),
IOCTL(DM_DEV_SET_GEOMETRY),
};
static const char *const dm_devs[] = {
"device-mapper",
};
static void dm_sanitise(const struct ioctl_group *grp, int childno)
{
struct dm_ioctl *dm;
pick_random_ioctl(grp, childno);
shm->a3[childno] = (unsigned long) page_rand;
dm = (struct dm_ioctl *)shm->a3[childno];
/* set a sensible version to get past the initial checks */
dm->version[0] = DM_VERSION_MAJOR;
dm->version[1] = DM_VERSION_MINOR;
dm->version[2] = DM_VERSION_PATCHLEVEL;
/* clear one of these strings to pass some kernel validation */
if (rand_bool())
dm->name[0] = 0;
else
dm->uuid[0] = 0;
}
static const struct ioctl_group dm_grp_misc = {
.devtype = DEV_MISC,
.devs = dm_devs,
.devs_cnt = ARRAY_SIZE(dm_devs),
.sanitise = dm_sanitise,
.ioctls = dm_ioctls,
.ioctls_cnt = ARRAY_SIZE(dm_ioctls),
};
REG_IOCTL_GROUP(dm_grp_misc)
static const struct ioctl_group dm_grp_block = {
.devtype = DEV_BLOCK,
.devs = dm_devs,
.devs_cnt = ARRAY_SIZE(dm_devs),
.sanitise = dm_sanitise,
.ioctls = dm_ioctls,
.ioctls_cnt = ARRAY_SIZE(dm_ioctls),
};
REG_IOCTL_GROUP(dm_grp_block)
|