Lines 1329-1341
static int check_multipath(storage_objec
Link Here
|
1329 |
rc = EngFncs->dm_get_targets(disk, &targets); |
1329 |
rc = EngFncs->dm_get_targets(disk, &targets); |
1330 |
if (rc) { |
1330 |
if (rc) { |
1331 |
LOG_ERROR("Error getting DM mapping for disk %s.\n", disk->name); |
1331 |
LOG_ERROR("Error getting DM mapping for disk %s.\n", disk->name); |
|
|
1332 |
rc=0; |
1332 |
goto out; |
1333 |
goto out; |
1333 |
} |
1334 |
} |
1334 |
|
1335 |
|
1335 |
/* Reject all non-multipath devices. */ |
1336 |
/* Reject all non-multipath devices. */ |
1336 |
if (targets->type != DM_TARGET_MULTIPATH) { |
1337 |
if (targets->type != DM_TARGET_MULTIPATH) { |
1337 |
LOG_DEBUG("Disk %s is not a multipath device.\n", disk->name); |
1338 |
LOG_DEBUG("Disk %s is not a multipath device.\n", disk->name); |
1338 |
rc = EINVAL; |
1339 |
//rc = EINVAL; |
1339 |
goto out; |
1340 |
goto out; |
1340 |
} |
1341 |
} |
1341 |
|
1342 |
|
Lines 1396-1401
static void remove_multipath_children(li
Link Here
|
1396 |
} |
1397 |
} |
1397 |
|
1398 |
|
1398 |
/** |
1399 |
/** |
|
|
1400 |
* check_user_devicemapper |
1401 |
* |
1402 |
* Check if this disk is a User created DM device. |
1403 |
**/ |
1404 |
static int check_user_devicemapper(storage_object_t * disk) |
1405 |
{ |
1406 |
dm_device_list_t * dm_list, * dm_entry; |
1407 |
dm_target_t * targets = NULL; |
1408 |
local_disk_t * ld = disk->private_data; |
1409 |
int rc = 0, dm_user_targets_count = 0, i, dmup_len; |
1410 |
boolean user_dm_enable; |
1411 |
const char * const * dm_user_targets; |
1412 |
char * dm_user_prefix = "dm/"; |
1413 |
|
1414 |
LOG_ENTRY(); |
1415 |
|
1416 |
/* Get the list of active DM devices. */ |
1417 |
dm_list = get_dm_device_list(); |
1418 |
if (!dm_list) { |
1419 |
LOG_WARNING("Cannot get list of DM devices.\n"); |
1420 |
goto out; |
1421 |
} |
1422 |
|
1423 |
/* Search the DM list for an entry that matches this disk. */ |
1424 |
dm_entry = find_disk_in_dm_devices(disk, dm_list); |
1425 |
if (!dm_entry) { |
1426 |
LOG_DEBUG("Disk %s is not a DM device.\n", disk->name); |
1427 |
goto out; |
1428 |
} |
1429 |
|
1430 |
user_dm_enable = FALSE; |
1431 |
EngFncs->get_config_bool("devmapper.dm_user", &user_dm_enable); |
1432 |
|
1433 |
EngFncs->get_config_string_array("devmapper.dm_user_targets", |
1434 |
&dm_user_targets_count, &dm_user_targets); |
1435 |
|
1436 |
if (user_dm_enable == FALSE) { |
1437 |
LOG_DEBUG("devmapper.dm_user not enabled.\n"); |
1438 |
rc = EINVAL; |
1439 |
goto out; |
1440 |
} |
1441 |
|
1442 |
/* search the named targets in the config for the DM name*/ |
1443 |
user_dm_enable = FALSE; |
1444 |
for (i = 0; i < dm_user_targets_count; i++) { |
1445 |
if (strncmp(dm_user_targets[i], dm_entry->name, EVMS_NAME_SIZE) == 0) { |
1446 |
user_dm_enable = TRUE; |
1447 |
} |
1448 |
} |
1449 |
|
1450 |
if (user_dm_enable == FALSE) { |
1451 |
LOG_DEBUG("%s not found in devmapper.dm_user_targets.\n", dm_entry->name); |
1452 |
rc = EINVAL; |
1453 |
goto out; |
1454 |
} |
1455 |
|
1456 |
/* Get the DM mapping for this disk. */ |
1457 |
/* we can use this in the future if we need to, and it's good to check */ |
1458 |
strncpy(disk->name, dm_entry->name, EVMS_NAME_SIZE); |
1459 |
rc = EngFncs->dm_get_targets(disk, &targets); |
1460 |
if (rc) { |
1461 |
LOG_ERROR("Error getting DM mapping for disk %s.\n", disk->name); |
1462 |
goto out; |
1463 |
} |
1464 |
|
1465 |
/* Copy the DM name to this disk. */ |
1466 |
dmup_len = strlen(dm_user_prefix); |
1467 |
LOG_DEBUG("Changing disk name from %s to %s%s.\n", |
1468 |
disk->name, dm_user_prefix ,dm_entry->name); |
1469 |
|
1470 |
strncpy(disk->name, dm_user_prefix, dmup_len); |
1471 |
strncpy((disk->name)+dmup_len, dm_entry->name, EVMS_NAME_SIZE-dmup_len); |
1472 |
|
1473 |
/* Reject all multipath devices that |
1474 |
* were created by other EVMS plugins. |
1475 |
*/ |
1476 |
rc = check_multipath_name(disk); |
1477 |
if (rc) { |
1478 |
LOG_DEBUG("Multipath disk %s belongs to another EVMS plugin.\n", |
1479 |
disk->name); |
1480 |
goto out; |
1481 |
} |
1482 |
|
1483 |
ld->flags |= LD_FLAG_USERDM; |
1484 |
|
1485 |
out: |
1486 |
/*EngFncs->dm_deallocate_targets(targets); */ |
1487 |
LOG_EXIT_INT(rc); |
1488 |
return rc; |
1489 |
} |
1490 |
|
1491 |
/** |
1399 |
* get_geometry |
1492 |
* get_geometry |
1400 |
* |
1493 |
* |
1401 |
* Use the HDIO_GETGEO_BIG or HDIO_GETGEO ioctl to get the disk's geometry. |
1494 |
* Use the HDIO_GETGEO_BIG or HDIO_GETGEO ioctl to get the disk's geometry. |
Lines 1478-1483
static int get_fake_geometry(storage_obj
Link Here
|
1478 |
if (disk->dev_major == LOOP_MAJOR || |
1571 |
if (disk->dev_major == LOOP_MAJOR || |
1479 |
disk->dev_major == NBD_MAJOR || |
1572 |
disk->dev_major == NBD_MAJOR || |
1480 |
disk->dev_major == DRBD_MAJOR || |
1573 |
disk->dev_major == DRBD_MAJOR || |
|
|
1574 |
ld->flags & LD_FLAG_USERDM || |
1481 |
ld->flags & LD_FLAG_MULTIPATH) { |
1575 |
ld->flags & LD_FLAG_MULTIPATH) { |
1482 |
LOG_DEBUG("Creating fake geometry for disk %s.\n", disk->name); |
1576 |
LOG_DEBUG("Creating fake geometry for disk %s.\n", disk->name); |
1483 |
disk->geometry.heads = 255; |
1577 |
disk->geometry.heads = 255; |
Lines 1745-1750
static int LD_discover(list_anchor_t inp
Link Here
|
1745 |
/* Get the disk's hard-sector-size. */ |
1839 |
/* Get the disk's hard-sector-size. */ |
1746 |
get_hardsector_size(&working_disk); |
1840 |
get_hardsector_size(&working_disk); |
1747 |
|
1841 |
|
|
|
1842 |
/* Check for User created DM devices. */ |
1843 |
rc = check_user_devicemapper(&working_disk); |
1844 |
if (rc) { |
1845 |
close_dev(&working_disk); |
1846 |
continue; |
1847 |
} |
1848 |
|
1748 |
/* Get the disk's geometry. */ |
1849 |
/* Get the disk's geometry. */ |
1749 |
rc = get_geometry(&working_disk); |
1850 |
rc = get_geometry(&working_disk); |
1750 |
if (rc) { |
1851 |
if (rc) { |