Lines Matching defs:dmt

365 void dm_task_destroy(struct dm_task *dmt)
369 for (t = dmt->head; t; t = n) {
376 if (dmt->dev_name)
377 dm_free(dmt->dev_name);
379 if (dmt->newname)
380 dm_free(dmt->newname);
382 if (dmt->message)
383 dm_free(dmt->message);
385 if (dmt->dmi.v4)
386 dm_free(dmt->dmi.v4);
388 if (dmt->uuid)
389 dm_free(dmt->uuid);
391 dm_free(dmt);
400 static int _dm_task_get_driver_version_v1(struct dm_task *dmt, char *version,
405 if (!dmt->dmi.v1) {
410 v = dmt->dmi.v1->version;
416 static int _unmarshal_status_v1(struct dm_task *dmt, struct dm_ioctl_v1 *dmi)
426 if (!dm_task_add_target(dmt, spec->sector_start,
454 static int _dm_task_get_info_v1(struct dm_task *dmt, struct dm_info *info)
456 if (!dmt->dmi.v1)
461 info->exists = dmt->dmi.v1->flags & DM_EXISTS_FLAG ? 1 : 0;
465 info->suspended = dmt->dmi.v1->flags & DM_SUSPEND_FLAG ? 1 : 0;
466 info->read_only = dmt->dmi.v1->flags & DM_READONLY_FLAG ? 1 : 0;
467 info->target_count = dmt->dmi.v1->target_count;
468 info->open_count = dmt->dmi.v1->open_count;
470 info->major = MAJOR(dmt->dmi.v1->dev);
471 info->minor = MINOR(dmt->dmi.v1->dev);
478 static const char *_dm_task_get_name_v1(const struct dm_task *dmt)
480 return (dmt->dmi.v1->name);
483 static const char *_dm_task_get_uuid_v1(const struct dm_task *dmt)
485 return (dmt->dmi.v1->uuid);
488 static struct dm_deps *_dm_task_get_deps_v1(struct dm_task *dmt)
494 static struct dm_names *_dm_task_get_names_v1(struct dm_task *dmt)
496 return (struct dm_names *) (((void *) dmt->dmi.v1) +
497 dmt->dmi.v1->data_start);
540 static struct dm_ioctl_v1 *_flatten_v1(struct dm_task *dmt)
551 for (t = dmt->head; t; t = t->next) {
557 if (count && dmt->newname) {
562 if (dmt->newname)
563 len += strlen(dmt->newname) + 1;
577 version = &_cmd_data_v1[dmt->type].version;
586 if (dmt->dev_name)
587 strncpy(dmi->name, dmt->dev_name, sizeof(dmi->name));
589 if (dmt->type == DM_DEVICE_SUSPEND)
591 if (dmt->read_only)
594 if (dmt->minor >= 0) {
595 if (dmt->major <= 0) {
600 dmi->dev = MKDEV(dmt->major, dmt->minor);
603 if (dmt->uuid)
604 strncpy(dmi->uuid, dmt->uuid, sizeof(dmi->uuid));
611 for (t = dmt->head; t; t = t->next)
615 if (dmt->newname)
616 strcpy(b, dmt->newname);
687 static int _dm_task_run_v1(struct dm_task *dmt)
692 dmi = _flatten_v1(dmt);
701 if ((unsigned) dmt->type >=
704 dmt->type);
708 command = _cmd_data_v1[dmt->type].cmd;
710 if (dmt->type == DM_DEVICE_TABLE)
713 log_debug("dm %s %s %s%s%s [%u]", _cmd_data_v1[dmt->type].name,
714 dmi->name, dmi->uuid, dmt->newname ? " " : "",
715 dmt->newname ? dmt->newname : "",
717 if (dmt->type == DM_DEVICE_LIST) {
725 _cmd_data_v1[dmt->type].name,
729 _cmd_data_v1[dmt->type].name,
740 switch (dmt->type) {
742 add_dev_node(dmt->dev_name, MAJOR(dmi->dev), MINOR(dmi->dev),
743 dmt->uid, dmt->gid, dmt->mode, 0);
747 rm_dev_node(dmt->dev_name, 0);
751 rename_dev_node(dmt->dev_name, dmt->newname, 0);
756 add_dev_node(dmt->dev_name, MAJOR(dmi->dev),
757 MINOR(dmi->dev), dmt->uid,
758 dmt->gid, dmt->mode, 0);
760 rm_dev_node(dmt->dev_name, 0);
765 if (!_unmarshal_status_v1(dmt, dmi))
771 dmt->type = DM_DEVICE_INFO;
772 if (!dm_task_run(dmt))
778 dmt->dmi.v1 = dmi;
792 int dm_task_get_driver_version(struct dm_task *dmt, char *version, size_t size)
798 return _dm_task_get_driver_version_v1(dmt, version, size);
801 if (!dmt->dmi.v4) {
806 v = dmt->dmi.v4->version;
883 void *dm_get_next_target(struct dm_task *dmt, void *next,
890 t = dmt->head;
904 static int _unmarshal_status(struct dm_task *dmt, struct dm_ioctl *dmi)
913 if (!dm_task_add_target(dmt, spec->sector_start,
946 int dm_task_get_info(struct dm_task *dmt, struct dm_info *info)
950 return _dm_task_get_info_v1(dmt, info);
953 if (!dmt->dmi.v4)
958 info->exists = dmt->dmi.v4->flags & DM_EXISTS_FLAG ? 1 : 0;
962 info->suspended = dmt->dmi.v4->flags & DM_SUSPEND_FLAG ? 1 : 0;
963 info->read_only = dmt->dmi.v4->flags & DM_READONLY_FLAG ? 1 : 0;
964 info->live_table = dmt->dmi.v4->flags & DM_ACTIVE_PRESENT_FLAG ? 1 : 0;
965 info->inactive_table = dmt->dmi.v4->flags & DM_INACTIVE_PRESENT_FLAG ?
967 info->target_count = dmt->dmi.v4->target_count;
968 info->open_count = dmt->dmi.v4->open_count;
969 info->event_nr = dmt->dmi.v4->event_nr;
970 info->major = MAJOR(dmt->dmi.v4->dev);
971 info->minor = MINOR(dmt->dmi.v4->dev);
976 uint32_t dm_task_get_read_ahead(const struct dm_task *dmt, uint32_t *read_ahead)
988 if (!dmt->dmi.v4 || !(dmt->dmi.v4->flags & DM_EXISTS_FLAG))
991 if (*dmt->dmi.v4->name)
992 dev_name = dmt->dmi.v4->name;
993 else if (dmt->dev_name)
994 dev_name = dmt->dev_name;
1003 const char *dm_task_get_name(const struct dm_task *dmt)
1007 return _dm_task_get_name_v1(dmt);
1010 return (dmt->dmi.v4->name);
1013 const char *dm_task_get_uuid(const struct dm_task *dmt)
1017 return _dm_task_get_uuid_v1(dmt);
1020 return (dmt->dmi.v4->uuid);
1023 struct dm_deps *dm_task_get_deps(struct dm_task *dmt)
1027 return _dm_task_get_deps_v1(dmt);
1030 return (struct dm_deps *) (((void *) dmt->dmi.v4) +
1031 dmt->dmi.v4->data_start);
1034 struct dm_names *dm_task_get_names(struct dm_task *dmt)
1038 return _dm_task_get_names_v1(dmt);
1041 return (struct dm_names *) (((void *) dmt->dmi.v4) +
1042 dmt->dmi.v4->data_start);
1045 struct dm_versions *dm_task_get_versions(struct dm_task *dmt)
1047 return (struct dm_versions *) (((void *) dmt->dmi.v4) +
1048 dmt->dmi.v4->data_start);
1051 int dm_task_set_ro(struct dm_task *dmt)
1053 dmt->read_only = 1;
1057 int dm_task_set_read_ahead(struct dm_task *dmt, uint32_t read_ahead,
1060 dmt->read_ahead = read_ahead;
1061 dmt->read_ahead_flags = read_ahead_flags;
1066 int dm_task_suppress_identical_reload(struct dm_task *dmt)
1068 dmt->suppress_identical_reload = 1;
1072 int dm_task_set_newname(struct dm_task *dmt, const char *newname)
1084 if (!(dmt->newname = dm_strdup(newname))) {
1092 int dm_task_set_message(struct dm_task *dmt, const char *message)
1094 if (!(dmt->message = dm_strdup(message))) {
1102 int dm_task_set_sector(struct dm_task *dmt, uint64_t sector)
1104 dmt->sector = sector;
1109 int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, const char *heads, const char *sectors, const char *start)
1113 if (!(dmt->geometry = dm_malloc(len))) {
1118 if (sprintf(dmt->geometry, "%s %s %s %s", cylinders, heads, sectors, start) < 0) {
1126 int dm_task_no_flush(struct dm_task *dmt)
1128 dmt->no_flush = 1;
1133 int dm_task_no_open_count(struct dm_task *dmt)
1135 dmt->no_open_count = 1;
1140 int dm_task_skip_lockfs(struct dm_task *dmt)
1142 dmt->skip_lockfs = 1;
1147 int dm_task_query_inactive_table(struct dm_task *dmt)
1149 dmt->query_inactive_table = 1;
1154 int dm_task_set_event_nr(struct dm_task *dmt, uint32_t event_nr)
1156 dmt->event_nr = event_nr;
1238 struct dm_task *dmt;
1241 if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
1244 if (!dm_task_run(dmt))
1247 if (!(names = dm_task_get_names(dmt)))
1264 dm_task_destroy(dmt);
1268 static struct dm_ioctl *_flatten(struct dm_task *dmt, unsigned repeat_count)
1280 for (t = dmt->head; t; t = t->next) {
1286 if (count && (dmt->sector || dmt->message)) {
1291 if (count && dmt->newname) {
1296 if (count && dmt->geometry) {
1301 if (dmt->newname && (dmt->sector || dmt->message)) {
1306 if (dmt->newname && dmt->geometry) {
1311 if (dmt->geometry && (dmt->sector || dmt->message)) {
1316 if (dmt->sector && !dmt->message) {
1321 if (dmt->newname)
1322 len += strlen(dmt->newname) + 1;
1324 if (dmt->message)
1325 len += sizeof(struct dm_target_msg) + strlen(dmt->message) + 1;
1327 if (dmt->geometry)
1328 len += strlen(dmt->geometry) + 1;
1346 version = &_cmd_data_v4[dmt->type].version;
1355 if (dmt->minor >= 0) {
1356 if (dmt->major <= 0) {
1361 if (!_dm_multiple_major_support && dmt->allow_default_major_fallback &&
1362 dmt->major != _dm_device_major) {
1365 dmt->major, _dm_device_major);
1366 dmt->major = _dm_device_major;
1370 dmi->dev = MKDEV(dmt->major, dmt->minor);
1374 if (_dm_version_minor < 3 && !dmt->dev_name && !dmt->uuid && dmi->dev) {
1377 ":%" PRIu32 ")", dmt->major, dmt->minor);
1382 dmt->major, dmt->minor, dmi->name);
1386 if (dmt->dev_name && (dmt->type != DM_DEVICE_RESUME || dmt->minor < 0 ||
1387 dmt->major < 0))
1388 strncpy(dmi->name, dmt->dev_name, sizeof(dmi->name));
1390 if (dmt->uuid)
1391 strncpy(dmi->uuid, dmt->uuid, sizeof(dmi->uuid));
1393 if (dmt->type == DM_DEVICE_SUSPEND)
1395 if (dmt->no_flush)
1397 if (dmt->read_only)
1399 if (dmt->skip_lockfs)
1401 if (dmt->query_inactive_table) {
1409 dmi->event_nr = dmt->event_nr;
1414 for (t = dmt->head; t; t = t->next)
1418 if (dmt->newname)
1419 strcpy(b, dmt->newname);
1421 if (dmt->message) {
1423 tmsg->sector = dmt->sector;
1424 strcpy(tmsg->message, dmt->message);
1427 if (dmt->geometry)
1428 strcpy(b, dmt->geometry);
1437 static int _process_mapper_dir(struct dm_task *dmt)
1455 dm_task_set_name(dmt, dirent->d_name);
1456 dm_task_run(dmt);
1465 static int _process_all_v4(struct dm_task *dmt)
1490 if (!dm_task_set_name(dmt, names->name)) {
1494 if (!dm_task_run(dmt))
1504 static int _mknodes_v4(struct dm_task *dmt)
1506 (void) _process_mapper_dir(dmt);
1508 return _process_all_v4(dmt);
1515 static int _udev_complete(struct dm_task *dmt)
1519 if (dmt->cookie_set) {
1521 cookie = (dmt->event_nr & ~DM_UDEV_FLAGS_MASK) |
1529 static int _create_and_load_v4(struct dm_task *dmt)
1537 _udev_complete(dmt);
1542 if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name)) {
1544 _udev_complete(dmt);
1548 if (dmt->uuid && !dm_task_set_uuid(task, dmt->uuid)) {
1550 _udev_complete(dmt);
1554 task->major = dmt->major;
1555 task->minor = dmt->minor;
1556 task->uid = dmt->uid;
1557 task->gid = dmt->gid;
1558 task->mode = dmt->mode;
1560 task->event_nr = dmt->event_nr & DM_UDEV_FLAGS_MASK;
1561 task->cookie_set = dmt->cookie_set;
1566 _udev_complete(dmt);
1573 _udev_complete(dmt);
1578 if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name)) {
1580 _udev_complete(dmt);
1584 task->read_only = dmt->read_only;
1585 task->head = dmt->head;
1586 task->tail = dmt->tail;
1594 _udev_complete(dmt);
1599 dmt->type = DM_DEVICE_RESUME;
1600 dm_free(dmt->uuid);
1601 dmt->uuid = NULL;
1603 r = dm_task_run(dmt);
1609 dmt->type = DM_DEVICE_REMOVE;
1610 dm_free(dmt->uuid);
1611 dmt->uuid = NULL;
1612 dmt->cookie_set = 0;
1614 if (!dm_task_run(dmt))
1620 uint64_t dm_task_get_existing_table_size(struct dm_task *dmt)
1622 return dmt->existing_table_size;
1625 static int _reload_with_suppression_v4(struct dm_task *dmt)
1638 if (dmt->dev_name && !dm_task_set_name(task, dmt->dev_name)) {
1643 if (dmt->uuid && !dm_task_set_uuid(task, dmt->uuid)) {
1648 task->major = dmt->major;
1649 task->minor = dmt->minor;
1662 dmt->existing_table_size = t2 ? t2->start + t2->length : 0;
1664 if ((task->dmi.v4->flags & DM_READONLY_FLAG) ? 1 : 0 != dmt->read_only)
1667 t1 = dmt->head;
1683 dmt->dmi.v4 = task->dmi.v4;
1693 dmt->suppress_identical_reload = 0;
1694 r = dm_task_run(dmt);
1699 static struct dm_ioctl *_do_dm_ioctl(struct dm_task *dmt, unsigned command,
1704 dmi = _flatten(dmt, repeat_count);
1710 if (dmt->type == DM_DEVICE_TABLE)
1715 if (dmt->no_open_count)
1727 if (dm_udev_get_sync_support() && !dmt->cookie_set &&
1728 (dmt->type == DM_DEVICE_RESUME ||
1729 dmt->type == DM_DEVICE_REMOVE ||
1730 dmt->type == DM_DEVICE_RENAME)) {
1750 _cmd_data_v4[dmt->type].name,
1751 dmi->name, dmi->uuid, dmt->newname ? " " : "",
1752 dmt->newname ? dmt->newname : "",
1753 dmt->major > 0 ? "(" : "",
1754 dmt->major > 0 ? dmt->major : 0,
1755 dmt->major > 0 ? ":" : "",
1756 dmt->minor > 0 ? dmt->minor : 0,
1757 dmt->major > 0 && dmt->minor == 0 ? "0" : "",
1758 dmt->major > 0 ? ") " : "",
1759 dmt->no_open_count ? 'N' : 'O',
1760 dmt->no_flush ? 'N' : 'F',
1761 dmt->skip_lockfs ? "S " : "",
1762 dmt->query_inactive_table ? "I " : "",
1763 dmt->sector, dmt->message ? dmt->message : "",
1767 if (errno == ENXIO && ((dmt->type == DM_DEVICE_INFO) ||
1768 (dmt->type == DM_DEVICE_MKNODES) ||
1769 (dmt->type == DM_DEVICE_STATUS)))
1775 _cmd_data_v4[dmt->type].name,
1780 _cmd_data_v4[dmt->type].name,
1796 int dm_task_run(struct dm_task *dmt)
1804 return _dm_task_run_v1(dmt);
1807 if ((unsigned) dmt->type >=
1810 dmt->type);
1814 command = _cmd_data_v4[dmt->type].cmd;
1817 if (dmt->type == DM_DEVICE_CREATE && dmt->head)
1818 return _create_and_load_v4(dmt);
1820 if (dmt->type == DM_DEVICE_MKNODES && !dmt->dev_name &&
1821 !dmt->uuid && dmt->major <= 0)
1822 return _mknodes_v4(dmt);
1824 if ((dmt->type == DM_DEVICE_RELOAD) && dmt->suppress_identical_reload)
1825 return _reload_with_suppression_v4(dmt);
1828 _udev_complete(dmt);
1834 if (!(dmi = _do_dm_ioctl(dmt, command, _ioctl_buffer_double_factor))) {
1835 _udev_complete(dmt);
1840 switch (dmt->type) {
1855 check_udev = dmt->cookie_set &&
1856 !(dmt->event_nr >> DM_UDEV_FLAGS_SHIFT &
1859 switch (dmt->type) {
1861 if (dmt->dev_name && *dmt->dev_name)
1862 add_dev_node(dmt->dev_name, MAJOR(dmi->dev),
1863 MINOR(dmi->dev), dmt->uid, dmt->gid,
1864 dmt->mode, check_udev);
1868 if (dmt->dev_name)
1869 rm_dev_node(dmt->dev_name, check_udev);
1874 if (dmt->dev_name)
1875 rename_dev_node(dmt->dev_name, dmt->newname,
1881 set_dev_node_read_ahead(dmt->dev_name, dmt->read_ahead,
1882 dmt->read_ahead_flags);
1888 MINOR(dmi->dev), dmt->uid,
1889 dmt->gid, dmt->mode, 0);
1890 else if (dmt->dev_name)
1891 rm_dev_node(dmt->dev_name, 0);
1897 if (!_unmarshal_status(dmt, dmi))
1903 if (dmt->dmi.v4)
1904 dm_free(dmt->dmi.v4);
1905 dmt->dmi.v4 = dmi;