+++ /dev/null
-diff --git a/dmsetup/dmsetup.c b/dmsetup/dmsetup.c
-index 25f14a6..b693008 100644
---- a/dmsetup/dmsetup.c
-+++ b/dmsetup/dmsetup.c
-@@ -995,6 +995,94 @@ static int _status(int argc, char **argv
- return r;
- }
-
-+static int _export(int argc, char **argv, void *data)
-+{
-+ int r = 0;
-+ struct dm_task *dmt = NULL;
-+ void *next = NULL;
-+ uint64_t start, length;
-+ char *target_type = NULL;
-+ char *params;
-+ struct dm_names *names = (struct dm_names *) data;
-+ const char *name = NULL;
-+ const char *uuid = NULL;
-+ struct dm_info info;
-+
-+ if (data)
-+ name = names->name;
-+ else if (argc == 2)
-+ name = argv[1];
-+
-+ if (!(dmt = dm_task_create(DM_DEVICE_STATUS)))
-+ goto out;
-+
-+ if (!_set_task_device(dmt, name, 0))
-+ goto out;
-+
-+ if (!dm_task_run(dmt))
-+ goto out;
-+
-+ if (!dm_task_get_info(dmt, &info) || !info.exists)
-+ goto out;
-+
-+ if (!name)
-+ name = dm_task_get_name(dmt);
-+
-+ uuid = dm_task_get_uuid(dmt);
-+ printf("DM_NAME=%s\n", name);
-+
-+ if ((uuid = dm_task_get_uuid(dmt)) && *uuid)
-+ printf("DM_UUID=%s\n", uuid);
-+
-+ if (!info.exists) {
-+ printf("DM_STATE=NOTPRESENT\n");
-+ goto out;
-+ }
-+
-+ printf("DM_STATE=%s\n",
-+ info.suspended ? "SUSPENDED" :
-+ (info.read_only ? " READONLY" : "ACTIVE"));
-+
-+ if (!info.live_table && !info.inactive_table)
-+ printf("DM_TABLE_STATE=NONE\n");
-+ else
-+ printf("DM_TABLE_STATE=%s%s%s\n",
-+ info.live_table ? "LIVE" : "",
-+ info.live_table && info.inactive_table ? "/" : "",
-+ info.inactive_table ? "INACTIVE" : "");
-+
-+ if (info.open_count != -1)
-+ printf("DM_OPENCOUNT=%d\n", info.open_count);
-+
-+ printf("DM_LAST_EVENT_NR=%" PRIu32 "\n", info.event_nr);
-+
-+ printf("DM_MAJOR=%d\n", info.major);
-+ printf("DM_MINOR=%d\n", info.minor);
-+
-+ if (info.target_count != -1)
-+ printf("DM_TARGET_COUNT=%d\n", info.target_count);
-+
-+ /* export all table types */
-+ next = dm_get_next_target(dmt, next, &start, &length,
-+ &target_type, ¶ms);
-+ if (target_type) {
-+ printf("DM_TARGET_TYPES=%s", target_type);
-+ while (next) {
-+ next = dm_get_next_target(dmt, next, &start, &length,
-+ &target_type, ¶ms);
-+ if (target_type)
-+ printf(",%s", target_type);
-+ }
-+ printf("\n");
-+ }
-+
-+ r = 1;
-+ out:
-+ if (dmt)
-+ dm_task_destroy(dmt);
-+ return r;
-+}
-+
- /* Show target names and their version numbers */
- static int _targets(int argc __attribute((unused)), char **argv __attribute((unused)), void *data __attribute((unused)))
- {
-@@ -1699,6 +1787,7 @@ static struct command _commands[] = {
- {"info", "[<device>]", 0, 1, _info},
- {"deps", "[<device>]", 0, 1, _deps},
- {"status", "[<device>] [--target <target_type>]", 0, 1, _status},
-+ {"export", "[<device>]", 0, 1, _export},
- {"table", "[<device>] [--target <target_type>] [--showkeys]", 0, 1, _status},
- {"wait", "<device> [<event_nr>]", 0, 2, _wait},
- {"mknodes", "[<device>]", 0, 1, _mknodes},
-diff --git a/man/dmsetup.8 b/man/dmsetup.8
-index 5b2ed9f..c4524aa 100644
---- a/man/dmsetup.8
-+++ b/man/dmsetup.8
-@@ -39,13 +39,16 @@ dmsetup \- low level logical volume mana
- .B dmsetup ls
- .I [--target target_type] [--exec command] [--tree [-o options]]
- .br
--.B dmsetup info
-+.B dmsetup info
- .I [device_name]
- .br
- .B dmsetup info -c|-C|--columns
- .I [--noheadings] [--separator separator] [-o fields] [-O|--sort sort_fields]
- .I [device_name]
- .br
-+.B dmsetup export
-+.I [device_name]
-+.br
- .B dmsetup deps
- .I [device_name]
- .br
-@@ -138,6 +141,10 @@ device_name in subsequent dmsetup comman
- If successful a device will appear as
- /dev/device-mapper/<device-name>.
- See below for information on the table format.
-+.IP \fBexport
-+.I [device_name]
-+.br
-+Outputs information in key/value format to be imported by other programs.
- .IP \fBdeps
- .I [device_name]
- .br