(argc == 3) ? atoi(argv[2]) : 0, 1);
}
-static int _process_mapper_dir(int argc, char **argv,
- int (*fn) (int argc, char **argv, void *data))
-{
- struct dirent *dirent;
- struct dm_names *names;
- DIR *d;
- const char *dir;
- int r = 1;
-
- dir = dm_dir();
- if (!(d = opendir(dir))) {
- fprintf(stderr, "opendir %s: %s", dir, strerror(errno));
- return 0;
- }
-
- while ((dirent = readdir(d))) {
- if (!strcmp(dirent->d_name, ".") ||
- !strcmp(dirent->d_name, "..") ||
- !strcmp(dirent->d_name, "control"))
- continue;
- /* Set up names->name for _info */
- names = (void *) dirent->d_name -
- ((void *) &names->name - (void *) &names->dev);
- if (!fn(argc, argv, names))
- r = 0;
- }
-
- if (closedir(d)) {
- fprintf(stderr, "closedir %s: %s", dir, strerror(errno));
- }
-
- return r;
-}
-
static int _process_all(int argc, char **argv,
int (*fn) (int argc, char **argv, void *data))
{
struct dm_task *dmt;
- if (!strcmp(argv[0], "mknodes"))
- r = _process_mapper_dir(argc, argv, fn);
-
if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
return 0;
}
+static int _mknodes(int argc, char **argv, void *data)
+{
+ struct dm_task *dmt;
+ int r = 0;
+
+ if (!(dmt = dm_task_create(DM_DEVICE_MKNODES)))
+ return 0;
+
+ if (argc == 2 && !dm_task_set_name(dmt, argv[1]))
+ goto out;
+
+ if (!dm_task_run(dmt))
+ goto out;
+
+ r = 1;
+
+ out:
+ dm_task_destroy(dmt);
+ return r;
+}
+
static int _info(int argc, char **argv, void *data)
{
int r = 0;
struct dm_task *dmt;
struct dm_names *names = (struct dm_names *) data;
- char *name;
- int taskno;
+ char *name = NULL;
if (argc == 1 && !data)
return _process_all(argc, argv, _info);
else
name = argv[1];
- if (!strcmp(argv[0], "mknodes"))
- taskno = DM_DEVICE_MKNODES;
- else
- taskno = DM_DEVICE_INFO;
-
- if (!(dmt = dm_task_create(taskno)))
+ if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
return 0;
- if (!dm_task_set_name(dmt, name))
+ if (name && !dm_task_set_name(dmt, name))
goto out;
if (!dm_task_run(dmt))
goto out;
- if (taskno == DM_DEVICE_INFO)
- _display_info(dmt);
+ _display_info(dmt);
r = 1;
{"ls", "", 0, 0, _ls},
{"info", "[<dev_name>]", 0, 1, _info},
{"deps", "[<dev_name>]", 0, 1, _deps},
- {"mknodes", "[<dev_name>]", 0, 1, _info},
{"status", "[<dev_name>]", 0, 1, _status},
{"table", "[<dev_name>]", 0, 1, _status},
{"wait", "<dev_name> [<event_nr>]", 1, 2, _wait},
+ {"mknodes", "[<dev_name>]", 0, 1, _mknodes},
{"targets", "", 0, 0, _targets},
{"version", "", 0, 0, _version},
{NULL, NULL, 0, 0, NULL}
return NULL;
}
+static int _process_mapper_dir(struct dm_task *dmt)
+{
+ struct dirent *dirent;
+ DIR *d;
+ const char *dir;
+ int r = 1;
+
+ dir = dm_dir();
+ if (!(d = opendir(dir))) {
+ fprintf(stderr, "opendir %s: %s", dir, strerror(errno));
+ return 0;
+ }
+
+ while ((dirent = readdir(d))) {
+ if (!strcmp(dirent->d_name, ".") ||
+ !strcmp(dirent->d_name, "..") ||
+ !strcmp(dirent->d_name, "control"))
+ continue;
+ dm_task_set_name(dmt, dirent->d_name);
+ dm_task_run(dmt);
+ }
+
+ if (closedir(d)) {
+ fprintf(stderr, "closedir %s: %s", dir, strerror(errno));
+ }
+
+ return r;
+}
+
+static int _process_all_v4(struct dm_task *dmt)
+{
+ struct dm_task *task;
+ struct dm_names *names;
+ unsigned next = 0;
+ int r = 1;
+
+ if (!(task = dm_task_create(DM_DEVICE_LIST)))
+ return 0;
+
+ if (!dm_task_run(task)) {
+ r = 0;
+ goto out;
+ }
+
+ if (!(names = dm_task_get_names(task))) {
+ r = 0;
+ goto out;
+ }
+
+ if (!names->dev)
+ goto out;
+
+ do {
+ names = (void *) names + next;
+ if (!dm_task_set_name(dmt, names->name)) {
+ r = 0;
+ goto out;
+ }
+ if (!dm_task_run(dmt))
+ r = 0;
+ next = names->next;
+ } while (next);
+
+ out:
+ dm_task_destroy(task);
+ return r;
+}
+
+static int _mknodes_v4(struct dm_task *dmt)
+{
+ (void) _process_mapper_dir(dmt);
+
+ return _process_all_v4(dmt);
+}
+
static int _create_and_load_v4(struct dm_task *dmt)
{
struct dm_task *task;
if (dmt->type == DM_DEVICE_CREATE && dmt->head)
return _create_and_load_v4(dmt);
+ if (dmt->type == DM_DEVICE_MKNODES && !dmt->dev_name)
+ return _mknodes_v4(dmt);
+
if (!_open_control())
return 0;