4 #include <libdevmapper.h>
6 #include <linux/kdev_t.h>
15 #define LOOPS_PER_SEC 5
18 dm_prereq (char * str, int x, int y, int z)
22 struct dm_versions *target;
23 struct dm_versions *last_target;
25 if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
28 dm_task_no_open_count(dmt);
30 if (!dm_task_run(dmt))
33 target = dm_task_get_versions(dmt);
35 /* Fetch targets and print 'em */
39 if (!strncmp(str, target->name, strlen(str)) &&
40 /* dummy prereq on multipath version */
41 target->version[0] >= x &&
42 target->version[1] >= y &&
43 target->version[2] >= z
47 target = (void *) target + target->next;
48 } while (last_target != target);
56 dm_simplecmd (int task, const char *name) {
60 if (!(dmt = dm_task_create (task)))
63 if (!dm_task_set_name (dmt, name))
66 dm_task_no_open_count(dmt);
68 r = dm_task_run (dmt);
71 dm_task_destroy (dmt);
76 dm_addmap (int task, const char *name, const char *target,
77 const char *params, unsigned long size) {
81 if (!(dmt = dm_task_create (task)))
84 if (!dm_task_set_name (dmt, name))
87 if (!dm_task_add_target (dmt, 0, size, target, params))
90 dm_task_no_open_count(dmt);
92 r = dm_task_run (dmt);
95 dm_task_destroy (dmt);
100 dm_map_present (char * str)
106 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
109 if (!dm_task_set_name(dmt, str))
112 dm_task_no_open_count(dmt);
114 if (!dm_task_run(dmt))
117 if (!dm_task_get_info(dmt, &info))
123 dm_task_destroy(dmt);
128 dm_get_map(char * name, unsigned long * size, char * outparams)
133 uint64_t start, length;
134 char *target_type = NULL;
137 if (!(dmt = dm_task_create(DM_DEVICE_TABLE)))
140 if (!dm_task_set_name(dmt, name))
143 dm_task_no_open_count(dmt);
145 if (!dm_task_run(dmt))
148 /* Fetch 1st target */
149 next = dm_get_next_target(dmt, next, &start, &length,
150 &target_type, ¶ms);
155 if (snprintf(outparams, PARAMS_SIZE, "%s", params) <= PARAMS_SIZE)
158 dm_task_destroy(dmt);
163 dm_get_status(char * name, char * outstatus)
168 uint64_t start, length;
172 if (!(dmt = dm_task_create(DM_DEVICE_STATUS)))
175 if (!dm_task_set_name(dmt, name))
178 dm_task_no_open_count(dmt);
180 if (!dm_task_run(dmt))
183 /* Fetch 1st target */
184 next = dm_get_next_target(dmt, next, &start, &length,
185 &target_type, &status);
187 if (snprintf(outstatus, PARAMS_SIZE, "%s", status) <= PARAMS_SIZE)
190 dm_task_destroy(dmt);
195 dm_type(char * name, char * type)
200 uint64_t start, length;
201 char *target_type = NULL;
204 if (!(dmt = dm_task_create(DM_DEVICE_TABLE)))
207 if (!dm_task_set_name(dmt, name))
210 dm_task_no_open_count(dmt);
212 if (!dm_task_run(dmt))
215 /* Fetch 1st target */
216 next = dm_get_next_target(dmt, next, &start, &length,
217 &target_type, ¶ms);
219 if (0 == strcmp(target_type, type))
223 dm_task_destroy(dmt);
228 dm_get_opencount (char * mapname)
234 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
237 if (!dm_task_set_name(dmt, mapname))
240 if (!dm_task_run(dmt))
243 if (!dm_task_get_info(dmt, &info))
248 dm_task_destroy(dmt);
253 dm_get_minor (char * mapname)
259 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
262 if (!dm_task_set_name(dmt, mapname))
265 if (!dm_task_run(dmt))
268 if (!dm_task_get_info(dmt, &info))
273 dm_task_destroy(dmt);
278 dm_flush_map (char * mapname, char * type)
280 if (!dm_type(mapname, type) || dm_get_opencount(mapname))
283 return dm_simplecmd(DM_DEVICE_REMOVE, mapname);
287 dm_flush_maps (char * type)
291 struct dm_names *names;
294 if (!(dmt = dm_task_create (DM_DEVICE_LIST)))
297 dm_task_no_open_count(dmt);
299 if (!dm_task_run (dmt))
302 if (!(names = dm_task_get_names (dmt)))
309 r += dm_flush_map(names->name, type);
311 names = (void *) names + next;
315 dm_task_destroy (dmt);
320 dm_fail_path(char * mapname, char * path)
326 if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG)))
329 if (!dm_task_set_name(dmt, mapname))
332 if (!dm_task_set_sector(dmt, 0))
335 if (snprintf(str, 32, "fail_path %s\n", path) > 32)
338 if (!dm_task_set_message(dmt, str))
341 dm_task_no_open_count(dmt);
343 if (!dm_task_run(dmt))
348 dm_task_destroy(dmt);
353 dm_reinstate(char * mapname, char * path)
359 if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG)))
362 if (!dm_task_set_name(dmt, mapname))
365 if (!dm_task_set_sector(dmt, 0))
368 if (snprintf(str, 32, "reinstate_path %s\n", path) > 32)
371 if (!dm_task_set_message(dmt, str))
374 dm_task_no_open_count(dmt);
376 if (!dm_task_run(dmt))
381 dm_task_destroy(dmt);
386 dm_groupmsg (char * msg, char * mapname, int index)
392 if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG)))
395 if (!dm_task_set_name(dmt, mapname))
398 if (!dm_task_set_sector(dmt, 0))
401 snprintf(str, 24, "%s_group %i\n", msg, index);
402 condlog(3, "message %s 0 %s", mapname, str);
404 if (!dm_task_set_message(dmt, str))
407 dm_task_no_open_count(dmt);
409 if (!dm_task_run(dmt))
415 dm_task_destroy(dmt);
421 dm_switchgroup(char * mapname, int index)
423 return dm_groupmsg("switch", mapname,index);
427 dm_enablegroup(char * mapname, int index)
429 return dm_groupmsg("enable", mapname,index);
433 dm_disablegroup(char * mapname, int index)
435 return dm_groupmsg("disable", mapname,index);
439 dm_get_maps (vector mp, char * type)
441 struct multipath * mpp;
444 struct dm_names *names;
450 if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
453 dm_task_no_open_count(dmt);
455 if (!dm_task_run(dmt))
458 if (!(names = dm_task_get_names(dmt)))
462 r = 0; /* this is perfectly valid */
467 if (dm_type(names->name, type)) {
468 mpp = alloc_multipath();
473 if (dm_get_map(names->name, &mpp->size, mpp->params))
476 if (dm_get_status(names->name, mpp->status))
479 mpp->alias = MALLOC(strlen(names->name) + 1);
484 strncat(mpp->alias, names->name, strlen(names->name));
486 if (!vector_alloc_slot(mp))
489 vector_set_slot(mp, mpp);
493 names = (void *) names + next;
499 free_multipath(mpp, KEEP_PATHS);
501 dm_task_destroy (dmt);
506 dm_geteventnr (char *name)
511 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
514 if (!dm_task_set_name(dmt, name))
517 dm_task_no_open_count(dmt);
519 if (!dm_task_run(dmt))
522 if (!dm_task_get_info(dmt, &info)) {
533 dm_task_destroy(dmt);
535 return info.event_nr;
539 dm_mapname(int major, int minor, char *type)
543 uint64_t start, length;
544 char *target_type = NULL;
547 int loop = MAX_WAIT * LOOPS_PER_SEC;
549 if (!(dmt = dm_task_create(DM_DEVICE_STATUS)))
552 if (!dm_task_set_major(dmt, major) ||
553 !dm_task_set_minor(dmt, minor))
556 dm_task_no_open_count(dmt);
559 * device map might not be ready when we get here from
563 r = dm_task_run(dmt);
568 usleep(1000 * 1000 / LOOPS_PER_SEC);
578 next = dm_get_next_target(dmt, next, &start, &length,
579 &target_type, ¶ms);
580 if (target_type && strcmp(target_type, type))
585 dm_task_destroy(dmt);
586 return strdup(dm_task_get_name(dmt));
588 dm_task_destroy(dmt);