4 #include <libdevmapper.h>
6 #include <linux/kdev_t.h>
14 dm_prereq (char * str, int x, int y, int z)
18 struct dm_versions *target;
19 struct dm_versions *last_target;
21 if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
24 dm_task_no_open_count(dmt);
26 if (!dm_task_run(dmt))
29 target = dm_task_get_versions(dmt);
31 /* Fetch targets and print 'em */
35 if (!strncmp(str, target->name, strlen(str)) &&
36 /* dummy prereq on multipath version */
37 target->version[0] >= x &&
38 target->version[1] >= y &&
39 target->version[2] >= z
43 target = (void *) target + target->next;
44 } while (last_target != target);
52 dm_simplecmd (int task, const char *name) {
56 if (!(dmt = dm_task_create (task)))
59 if (!dm_task_set_name (dmt, name))
62 dm_task_no_open_count(dmt);
64 r = dm_task_run (dmt);
67 dm_task_destroy (dmt);
72 dm_addmap (int task, const char *name, const char *target,
73 const char *params, unsigned long size) {
77 if (!(dmt = dm_task_create (task)))
80 if (!dm_task_set_name (dmt, name))
83 if (!dm_task_add_target (dmt, 0, size, target, params))
86 dm_task_no_open_count(dmt);
88 r = dm_task_run (dmt);
91 dm_task_destroy (dmt);
96 dm_map_present (char * str)
102 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
105 if (!dm_task_set_name(dmt, str))
108 dm_task_no_open_count(dmt);
110 if (!dm_task_run(dmt))
113 if (!dm_task_get_info(dmt, &info))
119 dm_task_destroy(dmt);
124 dm_get_map(char * name, unsigned long * size, char * outparams)
129 uint64_t start, length;
130 char *target_type = NULL;
133 if (!(dmt = dm_task_create(DM_DEVICE_TABLE)))
136 if (!dm_task_set_name(dmt, name))
139 dm_task_no_open_count(dmt);
141 if (!dm_task_run(dmt))
144 /* Fetch 1st target */
145 next = dm_get_next_target(dmt, next, &start, &length,
146 &target_type, ¶ms);
151 if (snprintf(outparams, PARAMS_SIZE, "%s", params) <= PARAMS_SIZE)
154 dm_task_destroy(dmt);
159 dm_get_status(char * name, char * outstatus)
164 uint64_t start, length;
168 if (!(dmt = dm_task_create(DM_DEVICE_STATUS)))
171 if (!dm_task_set_name(dmt, name))
174 dm_task_no_open_count(dmt);
176 if (!dm_task_run(dmt))
179 /* Fetch 1st target */
180 next = dm_get_next_target(dmt, next, &start, &length,
181 &target_type, &status);
183 if (snprintf(outstatus, PARAMS_SIZE, "%s", status) <= PARAMS_SIZE)
186 dm_task_destroy(dmt);
191 dm_type(char * name, char * type)
196 uint64_t start, length;
197 char *target_type = NULL;
200 if (!(dmt = dm_task_create(DM_DEVICE_TABLE)))
203 if (!dm_task_set_name(dmt, name))
206 dm_task_no_open_count(dmt);
208 if (!dm_task_run(dmt))
211 /* Fetch 1st target */
212 next = dm_get_next_target(dmt, next, &start, &length,
213 &target_type, ¶ms);
215 if (0 == strcmp(target_type, type))
219 dm_task_destroy(dmt);
224 dm_get_opencount (char * mapname)
230 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
233 if (!dm_task_set_name(dmt, mapname))
236 if (!dm_task_run(dmt))
239 if (!dm_task_get_info(dmt, &info))
244 dm_task_destroy(dmt);
249 dm_flush_maps (char * type)
253 struct dm_names *names;
256 if (!(dmt = dm_task_create (DM_DEVICE_LIST)))
259 dm_task_no_open_count(dmt);
261 if (!dm_task_run (dmt))
264 if (!(names = dm_task_get_names (dmt)))
271 if (dm_type(names->name, type) &&
272 dm_get_opencount(names->name) == 0 &&
273 !dm_simplecmd(DM_DEVICE_REMOVE, names->name))
277 names = (void *) names + next;
281 dm_task_destroy (dmt);
286 dm_fail_path(char * mapname, char * path)
292 if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG)))
295 if (!dm_task_set_name(dmt, mapname))
298 if (!dm_task_set_sector(dmt, 0))
301 if (snprintf(str, 32, "fail_path %s\n", path) > 32)
304 if (!dm_task_set_message(dmt, str))
307 dm_task_no_open_count(dmt);
309 if (!dm_task_run(dmt))
314 dm_task_destroy(dmt);
319 dm_reinstate(char * mapname, char * path)
325 if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG)))
328 if (!dm_task_set_name(dmt, mapname))
331 if (!dm_task_set_sector(dmt, 0))
334 if (snprintf(str, 32, "reinstate_path %s\n", path) > 32)
337 if (!dm_task_set_message(dmt, str))
340 dm_task_no_open_count(dmt);
342 if (!dm_task_run(dmt))
347 dm_task_destroy(dmt);
352 dm_switchgroup(char * mapname, int index)
358 if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG)))
361 if (!dm_task_set_name(dmt, mapname))
364 if (!dm_task_set_sector(dmt, 0))
367 snprintf(str, 24, "switch_group %i\n", index);
368 condlog(3, "message %s 0 %s", mapname, str);
370 if (!dm_task_set_message(dmt, str))
373 dm_task_no_open_count(dmt);
375 if (!dm_task_run(dmt))
381 dm_task_destroy(dmt);
387 dm_get_maps (vector mp, char * type)
389 struct multipath * mpp;
392 struct dm_names *names;
398 if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
401 dm_task_no_open_count(dmt);
403 if (!dm_task_run(dmt))
406 if (!(names = dm_task_get_names(dmt)))
410 r = 0; /* this is perfectly valid */
415 if (dm_type(names->name, type)) {
416 mpp = alloc_multipath();
421 if (dm_get_map(names->name, &mpp->size, mpp->params))
424 if (dm_get_status(names->name, mpp->status))
427 mpp->alias = MALLOC(strlen(names->name) + 1);
432 strncat(mpp->alias, names->name, strlen(names->name));
434 if (!vector_alloc_slot(mp))
437 vector_set_slot(mp, mpp);
441 names = (void *) names + next;
447 free_multipath(mpp, KEEP_PATHS);
449 dm_task_destroy (dmt);
454 dm_geteventnr (char *name)
459 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
462 if (!dm_task_set_name(dmt, name))
465 dm_task_no_open_count(dmt);
467 if (!dm_task_run(dmt))
470 if (!dm_task_get_info(dmt, &info)) {
481 dm_task_destroy(dmt);
483 return info.event_nr;