I have added basic support for mirrored targets to Christophe Saout's lilo patch. The patch should be applied after the "lilo-22.6-devmapper.patch" and makes it possible to run lilo on my dmraid created mirrored configuration. The code is by no means integrated with the MD based RAID-1 support in lilo, which of course would be neat, but it's a start. /Erik -----8<------ --- lilo-22.6-devmapper_patched/geometry.c Wed Oct 6 21:34:55 2004 +++ lilo-22.6-devmapper_patched_work/geometry.c Wed Oct 6 23:34:04 2004 @@ -930,57 +930,76 @@ if (!target_type) continue; - if (strcmp(target_type, "linear") != 0) - die("device-mapper: only linear boot device supported"); - target = alloc_t(DM_TARGET); target->start = start; target->length = length; - if (dm_version_nr < 4 && - isxdigit(params[0]) && - isxdigit(params[1]) && - params[2] == ':' && - isxdigit(params[3]) && - isxdigit(params[4])) { /* old 2.4 format */ - if (sscanf(params, "%02x:%02x %"PRIu64, &major, &minor, &target->offset) != 3) - die("device-mapper: parse error in linear params (\"%s\")", params); - } else if (isdigit(params[0]) && - strchr(params, ':')) { /* dm_bdevname/format_dev_t (>= 2.6.0-test4?) format */ - if (sscanf(params, "%u:%u %"PRIu64, &major, &minor, &target->offset) != 3) - die("device-mapper: parse error in linear params (\"%s\")", params); - } else { /* >= 2.5.69 format, this should go away soon */ - struct stat st; - FILE *file; - p = strrchr(params, ' '); - if (p == NULL) - die("device-mapper: parse error in linear params (\"%s\")", params); - *p = 0; - sprintf(buf, "/dev/%s", params); /* let's hope it's there */ - if (stat(buf, &st) == 0) { - if (!S_ISBLK(st.st_mode)) - die("device-mapper: %s is not a valid block device", buf); - major = MAJOR(st.st_rdev); - minor = MINOR(st.st_rdev); - } else { /* let's try sysfs */ - int dev; - sprintf(buf, "/sys/block/%s/dev", params); - file = fopen(buf, "r"); - if (!file) - die("device-mapper: \"%s\" could not be opened. /sys mounted?", buf); - if (!fgets(buf, PATH_MAX, file)) - die("device-mapper: read error from \"/sys/block/%s/dev\"", params); - if (sscanf(buf, "%u:%u", &major, &minor) != 2) { - if (sscanf(buf, "%x", &dev) != 1) - die("device-mapper: error getting device from \"%s\"", buf); - major = MAJOR(dev); - minor = MINOR(dev); + if (strcmp(target_type, "mirror") == 0){ + int device_count = 0; + uint64_t secondary_offset = 0; + int secondary_major; + int secondary_minor; + if(sscanf(params, "%*s %*d %*d %*s %d %u:%u %"PRIu64" %u:%u %"PRIu64, + &device_count, + &major, &minor, &target->offset, + &secondary_major, &secondary_minor, &secondary_offset) != 7){ + die("device-mapper: parse error in mirror params (\"%s\")", params); + } + if(device_count > 2){ + die("device-mapper: mirrors of more than 2 devices not supported"); + } + if(secondary_offset != target->offset){ + die("device-mapper: skewed mirrors not supported"); + } + } else if (strcmp(target_type, "linear") == 0) { + if (dm_version_nr < 4 && + isxdigit(params[0]) && + isxdigit(params[1]) && + params[2] == ':' && + isxdigit(params[3]) && + isxdigit(params[4])) { /* old 2.4 format */ + if (sscanf(params, "%02x:%02x %"PRIu64, &major, &minor, &target->offset) != 3) + die("device-mapper: parse error in linear params (\"%s\")", params); + } else if (isdigit(params[0]) && + strchr(params, ':')) { /* dm_bdevname/format_dev_t (>= 2.6.0-test4?) format */ + if (sscanf(params, "%u:%u %"PRIu64, &major, &minor, &target->offset) != 3) + die("device-mapper: parse error in linear params (\"%s\")", params); + } else { /* >= 2.5.69 format, this should go away soon */ + struct stat st; + FILE *file; + + p = strrchr(params, ' '); + if (p == NULL) + die("device-mapper: parse error in linear params (\"%s\")", params); + *p = 0; + sprintf(buf, "/dev/%s", params); /* let's hope it's there */ + if (stat(buf, &st) == 0) { + if (!S_ISBLK(st.st_mode)) + die("device-mapper: %s is not a valid block device", buf); + major = MAJOR(st.st_rdev); + minor = MINOR(st.st_rdev); + } else { /* let's try sysfs */ + int dev; + sprintf(buf, "/sys/block/%s/dev", params); + file = fopen(buf, "r"); + if (!file) + die("device-mapper: \"%s\" could not be opened. /sys mounted?", buf); + if (!fgets(buf, PATH_MAX, file)) + die("device-mapper: read error from \"/sys/block/%s/dev\"", params); + if (sscanf(buf, "%u:%u", &major, &minor) != 2) { + if (sscanf(buf, "%x", &dev) != 1) + die("device-mapper: error getting device from \"%s\"", buf); + major = MAJOR(dev); + minor = MINOR(dev); + } + (void) fclose(file); } - (void) fclose(file); + *p = ' '; + if (sscanf(p+1, "%"PRIu64, &target->offset) != 1) + die("device-mapper: parse error in linear params (\"%s\")", params); } - *p = ' '; - if (sscanf(p+1, "%"PRIu64, &target->offset) != 1) - die("device-mapper: parse error in linear params (\"%s\")", params); + }else{ + die("device-mapper: only mirror or linear boot device supported"); } target->device = (major << 8) | minor; if (!device)