Skip to contentSkip to conversation

Add core devname mangling support

PATCH New Peter Rajnoha 1 participant 1 message Oct 14, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 3/6 Add core devname mangling support

This patch adds new libdevmapper functions to support name mangling:

(set/get mangling for the dm_task separately)
int dm_task_set_name_mangle(struct dm_task *dmt, dm_string_mangle_t name_mangle) dm_string_mangle_t dm_task_get_name_mangle(struct dm_task *dmt)

  (set/get default name mangling globally)
  int dm_set_default_name_mangle(dm_string_mangle_t name_mangle);
  dm_string_mangle_t dm_get_default_name_mangle(void);

Normally, a value defined with "--with-default-name-mangle" during configure will be used by default. However, if we'd like to override it in runtime, we can do that by calling dm_set_default_name_mangle.

When calling dm_task_create, this default value is assigned for all newly created dm tasks.

However, it's sometimes handy to set the mangling for each task separately, e.g. to switch the name mangling off to prevent double mangle of already mangled string - like we need to do when we're decoupling a higher level task into its constituents (e.g. "create" dm_task with table supplied, decoupled into "create", "load" and "resume" and others).

While calling the dm_task_set_name fn, the name supplied will be mangled automatically according to the setting stored in dm_task's "name_mangle" field.

As for the mangling, supported whitelist is set to be in sync with udev, that is:

0-9
A-Z
a-z
# + - . : = @ _

Peter

---
 libdm/ioctl/libdm-iface.c   |   24 ++++++++
 libdm/ioctl/libdm-targets.h |    1 +
 libdm/libdevmapper.h        |    8 +++
 libdm/libdm-common.c        |  131 +++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 159 insertions(+), 5 deletions(-)
libdm/ioctl/libdm-iface.c +24 -0
index 93cd770..a4a0130 100644
@@ -814,6 +814,18 @@ int dm_task_retry_remove(struct dm_task *dmt)
 	return 1;
 }
 
+int dm_task_set_name_mangle(struct dm_task *dmt, dm_string_mangle_t name_mangle)
+{
+	dmt->name_mangle = name_mangle;
+
+	return 1;
+}
+
+dm_string_mangle_t dm_task_get_name_mangle(struct dm_task *dmt)
+{
+	return dmt->name_mangle;
+}
+
 int dm_task_query_inactive_table(struct dm_task *dmt)
 {
 	dmt->query_inactive_table = 1;
@@ -1236,6 +1248,9 @@ static int _create_and_load_v4(struct dm_task *dmt)
 		return 0;
 	}
 
+	/* Prevent the name to be mangled twice. */
+	dm_task_set_name_mangle(task, DM_STRING_MANGLE_NONE);
+
 	/* Copy across relevant fields */
 	if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name)) {
 		dm_task_destroy(task);
@@ -1274,6 +1289,9 @@ static int _create_and_load_v4(struct dm_task *dmt)
 		goto revert;
 	}
 
+	/* Prevent the name to be mangled twice. */
+	dm_task_set_name_mangle(task, DM_STRING_MANGLE_NONE);
+
 	/* Copy across relevant fields */
 	if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name)) {
 		dm_task_destroy(task);
@@ -1349,6 +1367,9 @@ static int _reload_with_suppression_v4(struct dm_task *dmt)
 		return 0;
 	}
 
+	/* Prevent the name to be mangled twice. */
+	dm_task_set_name_mangle(task, DM_STRING_MANGLE_NONE);
+
 	/* Copy across relevant fields */
 	if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name)) {
 		dm_task_destroy(task);
@@ -1429,6 +1450,9 @@ static int _check_children_not_suspended_v4(struct dm_task *dmt, uint64_t device
 		task->major = MAJOR(device);
 		task->minor = MINOR(device);
 	} else {
+		/* Prevent the name to be mangled twice. */
+		dm_task_set_name_mangle(task, DM_STRING_MANGLE_NONE);
+
 		if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name))
 			goto out;
 
libdm/ioctl/libdm-targets.h +1 -0
index ca08fe8..f13da85 100644
@@ -64,6 +64,7 @@ struct dm_task {
 	int new_uuid;
 	int secure_data;
 	int retry_remove;
+	dm_string_mangle_t name_mangle;
 	int enable_checks;
 
 	char *uuid;
libdm/libdevmapper.h +8 -0
index 0598179..89ccf4c 100644
@@ -262,6 +262,14 @@ typedef enum {
 	DM_STRING_MANGLE_HEX	/* always mangle with hex encoding, no matter what the input is */
 } dm_string_mangle_t;
 
+/* Set/get default name mangle type assigned for each newly created dm_task. */
+int dm_set_default_name_mangle(dm_string_mangle_t name_mangle);
+dm_string_mangle_t dm_get_default_name_mangle(void);
+
+/* Set/get name mangle type for a specific dm_task individually. */
+int dm_task_set_name_mangle(struct dm_task *dmt, dm_string_mangle_t name_mangle);
+dm_string_mangle_t dm_task_get_name_mangle(struct dm_task *dmt);
+
 /*
  * Configure the device-mapper directory
  */
libdm/libdm-common.c +126 -5

178 lines not on this page · raw message