[dm-devel] [PATCH] libmultipath: simplify dm_get_name()
Hannes Reinecke
hare at suse.de
Tue Jul 20 08:10:29 UTC 2010
dm_get_name() should just return the device-mapper table
name corresponding to a given uuid. Happily the uuid is
another primary key in the device-mapper hash table, so
we can just use it directly and do not have to loop over
all existing tables.
Signed-off-by: Hannes Reinecke <hare at suse.de>
---
libmultipath/devmapper.c | 60 +++++++++++++++++++++++++++-----------------
libmultipath/devmapper.h | 2 +-
libmultipath/propsel.c | 11 +------
libmultipath/structs_vec.c | 8 +----
4 files changed, 42 insertions(+), 39 deletions(-)
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
index 333659b..fb69ee8 100644
--- a/libmultipath/devmapper.c
+++ b/libmultipath/devmapper.c
@@ -777,35 +777,49 @@ out:
return r;
}
-extern int
-dm_get_name(char *uuid, char *name)
+extern char *
+dm_get_name(char *uuid)
{
- vector vec;
- struct multipath *mpp;
- int i, rc = 0;
-
- vec = vector_alloc();
+ struct dm_task *dmt;
+ struct dm_info info;
+ char *prefixed_uuid, *name = NULL;
+ const char *nametmp;
- if (!vec)
- return 0;
+ dmt = dm_task_create(DM_DEVICE_INFO);
+ if (!dmt)
+ return NULL;
- if (dm_get_maps(vec)) {
- goto out;
+ prefixed_uuid = MALLOC(UUID_PREFIX_LEN + strlen(uuid) + 1);
+ if (!prefixed_uuid) {
+ condlog(0, "cannot create prefixed uuid : %s\n",
+ strerror(errno));
+ goto freeout;
}
+ sprintf(prefixed_uuid, UUID_PREFIX "%s", uuid);
+ if (!dm_task_set_uuid(dmt, prefixed_uuid))
+ goto freeout;
- vector_foreach_slot(vec, mpp, i) {
- if (!strcmp(uuid, mpp->wwid)) {
- strcpy(name, mpp->alias);
- rc=1;
- break;
- }
- }
-out:
- vector_foreach_slot(vec, mpp, i) {
- free_multipath(mpp, KEEP_PATHS);
+ if (!dm_task_run(dmt))
+ goto freeout;
+
+ if (!dm_task_get_info(dmt, &info) || !info.exists)
+ goto freeout;
+
+ nametmp = dm_task_get_name(dmt);
+ if (nametmp && strlen(nametmp)) {
+ name = MALLOC(strlen(nametmp) + 1);
+ if (name)
+ strcpy(name, nametmp);
+ } else {
+ condlog(2, "%s: no device-mapper name found", uuid);
}
- vector_free(vec);
- return rc;
+
+freeout:
+ if (prefixed_uuid)
+ FREE(prefixed_uuid);
+ dm_task_destroy(dmt);
+
+ return name;
}
int
diff --git a/libmultipath/devmapper.h b/libmultipath/devmapper.h
index f3ffeaa..6c22bf3 100644
--- a/libmultipath/devmapper.h
+++ b/libmultipath/devmapper.h
@@ -37,6 +37,6 @@ int dm_remove_partmaps (const char * mapname, int need_sync);
int dm_get_uuid(char *name, char *uuid);
int dm_get_info (char * mapname, struct dm_info ** dmi);
int dm_rename (char * old, char * new);
-int dm_get_name(char * uuid, char * name);
+char * dm_get_name(char * uuid);
#endif /* _DEVMAPPER_H */
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
index 3074ce1..9944675 100644
--- a/libmultipath/propsel.c
+++ b/libmultipath/propsel.c
@@ -247,15 +247,8 @@ select_alias (struct multipath * mp)
mp->alias = get_user_friendly_alias(mp->wwid,
conf->bindings_file, mp->alias_prefix);
}
- if (mp->alias == NULL){
- char *alias;
- if ((alias = MALLOC(WWID_SIZE)) != NULL){
- if (dm_get_name(mp->wwid, alias) == 1)
- mp->alias = alias;
- else
- FREE(alias);
- }
- }
+ if (mp->alias == NULL)
+ mp->alias = dm_get_name(mp->wwid);
if (mp->alias == NULL)
mp->alias = STRDUP(mp->wwid);
}
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index 51c41e8..c526a70 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -337,15 +337,11 @@ retry:
if (update_multipath_strings(mpp, vecs->pathvec)) {
char *new_alias;
- new_alias = MALLOC(WWID_SIZE);
- if (!new_alias) {
- condlog(0, "%s: failed to allocate alias", mpp->alias);
- goto out;
- }
/*
* detect an external rename of the multipath device
*/
- if (dm_get_name(mpp->wwid, new_alias)) {
+ new_alias = dm_get_name(mpp->wwid);
+ if (new_alias) {
condlog(3, "%s multipath mapped device name has "
"changed from %s to %s", mpp->wwid,
mpp->alias, new_alias);
--
1.6.0.2
More information about the dm-devel
mailing list