From 889c88e9dab33195efc4dc0400a4b0aaa3383948 Mon Sep 17 00:00:00 2001 From: Mikulas Patocka Date: Mon, 16 Sep 2019 05:58:10 -0400 Subject: [PATCH] dm: introduce DM_GET_TARGET_VERSION Adds support for the DM_GET_TARGET_VERSION to dmsetup. It introduces a new comman "target-version" that will accept list of targets and print their version. Signed-off-by: Mikulas Patocka (cherry picked from commit 667b33dd3be1068ffb92783e189cbc1b41c9ac28) Conflicts: device_mapper/all.h device_mapper/ioctl/libdm-iface.c device_mapper/misc/dm-ioctl.h --- libdm/ioctl/libdm-iface.c | 3 +++ libdm/libdevmapper.h | 4 +++- libdm/misc/dm-ioctl.h | 2 ++ tools/dmsetup.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c index 79ea51d7b..77bdd070f 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -118,6 +118,9 @@ static struct cmd_data _cmd_data_v4[] = { #ifdef DM_DEV_ARM_POLL {"armpoll", DM_DEV_ARM_POLL, {4, 36, 0}}, #endif +#ifdef DM_GET_TARGET_VERSION + {"target-version", DM_GET_TARGET_VERSION, {4, 41, 0}}, +#endif }; /* *INDENT-ON* */ diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h index e885f52ae..81c67dcf2 100644 --- a/libdm/libdevmapper.h +++ b/libdm/libdevmapper.h @@ -121,7 +121,9 @@ enum { DM_DEVICE_SET_GEOMETRY, - DM_DEVICE_ARM_POLL + DM_DEVICE_ARM_POLL, + + DM_GET_TARGET_VERSION }; /* diff --git a/libdm/misc/dm-ioctl.h b/libdm/misc/dm-ioctl.h index 79f574cd9..52a7a93d1 100644 --- a/libdm/misc/dm-ioctl.h +++ b/libdm/misc/dm-ioctl.h @@ -244,6 +244,7 @@ enum { DM_TARGET_MSG_CMD, DM_DEV_SET_GEOMETRY_CMD, DM_DEV_ARM_POLL_CMD, + DM_GET_TARGET_VERSION_CMD, }; #define DM_IOCTL 0xfd @@ -269,6 +270,7 @@ enum { #define DM_TARGET_MSG _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl) #define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl) +#define DM_GET_TARGET_VERSION _IOWR(DM_IOCTL, DM_GET_TARGET_VERSION_CMD, struct dm_ioctl) #define DM_VERSION_MAJOR 4 #define DM_VERSION_MINOR 36 diff --git a/tools/dmsetup.c b/tools/dmsetup.c index 15a09c628..dfa9e341a 100644 --- a/tools/dmsetup.c +++ b/tools/dmsetup.c @@ -2588,6 +2588,33 @@ out: return r; } +/* Show target names and their version numbers */ +static int _target_version(CMD_ARGS) +{ + int r = 0; + struct dm_task *dmt; + struct dm_versions *target; + + if (!(dmt = dm_task_create(DM_GET_TARGET_VERSION))) + return_0; + + if (!dm_task_set_name(dmt, argv[0])) + goto_out; + + if (!_task_run(dmt)) + goto_out; + + target = dm_task_get_versions(dmt); + printf("%-16s v%d.%d.%d\n", target->name, target->version[0], + target->version[1], target->version[2]); + + r = 1; + +out: + dm_task_destroy(dmt); + return r; +} + static int _info(CMD_ARGS) { int r = 0; @@ -6240,6 +6267,7 @@ static struct command _dmsetup_commands[] = { {"udevcomplete", "", 1, 1, 0, 0, _udevcomplete}, {"udevcomplete_all", "[]", 0, 1, 0, 0, _udevcomplete_all}, {"udevcookies", "", 0, 0, 0, 0, _udevcookies}, + {"target-version", "[...]", 1, -1, 1, 0, _target_version}, {"targets", "", 0, 0, 0, 0, _targets}, {"version", "", 0, 0, 0, 0, _version}, {"setgeometry", " ", 5, 5, 0, 0, _setgeometry},