extern int _dm_flush_map (const char * mapname, int need_sync, int deferred_remove) { int r; if (!dm_is_mpath(mapname)) return 0; /* nothing to do */ /* If you aren't doing a deferred remove, make sure that no * devices are in use */ if (!do_deferred(deferred_remove) && partmap_in_use(mapname, NULL)) return 1; if (dm_remove_partmaps(mapname, need_sync, deferred_remove)) return 1; if (!do_deferred(deferred_remove) && dm_get_opencount(mapname)) { condlog(2, "%s: map in use", mapname); return 1; } r = dm_device_remove(mapname, need_sync, deferred_remove); if (r) { if (do_deferred(deferred_remove) && dm_map_present(mapname)) { condlog(4, "multipath map %s remove deferred", mapname); return 2; } condlog(4, "multipath map %s removed", mapname); return 0; } return 1; }
int dm_device_remove_all(uint64_t *dev) { struct bl_dm_tree *p; struct dm_tree_node *node; const char *uuid; int ret = 0; uint32_t major, minor; uint64_t bl_dev; memcpy(&major, dev, sizeof(uint32_t)); memcpy(&minor, (void *)dev + sizeof(uint32_t), sizeof(uint32_t)); bl_dev = MKDEV(major, minor); p = find_bl_dm_tree(bl_dev); if (!p) return ret; node = dm_tree_find_node(p->tree, MAJOR(bl_dev), MINOR(bl_dev)); if (!node) return ret; uuid = dm_tree_node_get_uuid(node); if (!uuid) return ret; dm_device_remove(bl_dev); ret = dm_tree_deactivate_children(node, uuid, strlen(uuid)); dm_task_update_nodes(); bl_dm_remove_tree(bl_dev); return ret; }
static int remove_partmap(const char *name, void *data) { struct remove_data *rd = (struct remove_data *)data; if (dm_get_opencount(name)) { dm_remove_partmaps(name, rd->need_sync, rd->deferred_remove); if (!do_deferred(rd->deferred_remove) && dm_get_opencount(name)) { condlog(2, "%s: map in use", name); return 1; } } condlog(4, "partition map %s removed", name); dm_device_remove(name, rd->need_sync, rd->deferred_remove); return 0; }