diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c index 5a4ff4e5c..1431cf6ea 100644 --- a/libdm/libdm-deptree.c +++ b/libdm/libdm-deptree.c @@ -86,6 +86,7 @@ struct load_segment { unsigned clustered; /* Mirror */ unsigned mirror_area_count; /* Mirror */ uint32_t flags; /* Mirror log */ + char *uuid; /* Clustered mirror log */ }; /* Per-device properties */ @@ -1238,7 +1239,12 @@ static int _emit_segment_line(struct dm_task *dmt, struct load_segment *seg, uin case SEG_LINEAR: break; case SEG_MIRRORED: + log_parm_count = 1; /* Region size */ + log_parm_count = hweight32(seg->flags); /* [no]sync, block_on_error etc. */ + if (seg->clustered) { + if (seg->uuid) + log_parm_count++; /* uuid */ if ((tw = _dm_snprintf(params + pos, paramsize - pos, "clustered_")) < 0) { stack; /* Out of space */ return -1; @@ -1246,9 +1252,6 @@ static int _emit_segment_line(struct dm_task *dmt, struct load_segment *seg, uin pos += tw; } - log_parm_count = 1; /* Region size */ - log_parm_count = hweight32(seg->flags); /* [no]sync, block_on_error etc. */ - if (!seg->log) logtype = "core"; else { @@ -1278,6 +1281,14 @@ static int _emit_segment_line(struct dm_task *dmt, struct load_segment *seg, uin } pos += tw; + if (seg->clustered && seg->uuid) { + if ((tw = _dm_snprintf(params + pos, paramsize - pos, "%s ", seg->uuid)) < 0) { + stack; /* Out of space */ + return -1; + } + pos += tw; + } + if ((seg->flags & DM_NOSYNC)) { if ((tw = _dm_snprintf(params + pos, paramsize - pos, "nosync ")) < 0) { stack; /* Out of space */ @@ -1694,8 +1705,14 @@ int dm_tree_node_add_mirror_target_log(struct dm_tree_node *node, log_error("Couldn't find mirror log uuid %s.", log_uuid); return 0; } + if (!_link_tree_nodes(node, log_node)) return_0; + + if (!(seg->uuid = dm_pool_strdup(node->dtree->mem, log_uuid))) { + log_error("log uuid pool_strdup failed"); + return 0; + } } seg->log = log_node;