Lines 1315-1327
Link Here
|
1315 |
rc = EngFncs->dm_get_targets(disk, &targets); |
1315 |
rc = EngFncs->dm_get_targets(disk, &targets); |
1316 |
if (rc) { |
1316 |
if (rc) { |
1317 |
LOG_ERROR("Error getting DM mapping for disk %s.\n", disk->name); |
1317 |
LOG_ERROR("Error getting DM mapping for disk %s.\n", disk->name); |
|
|
1318 |
rc=0; |
1318 |
goto out; |
1319 |
goto out; |
1319 |
} |
1320 |
} |
1320 |
|
1321 |
|
1321 |
/* Reject all non-multipath devices. */ |
1322 |
/* Reject all non-multipath devices. */ |
1322 |
if (targets->type != DM_TARGET_MULTIPATH) { |
1323 |
if (targets->type != DM_TARGET_MULTIPATH) { |
1323 |
LOG_DEBUG("Disk %s is not a multipath device.\n", disk->name); |
1324 |
LOG_DEBUG("Disk %s is not a multipath device.\n", disk->name); |
1324 |
rc = EINVAL; |
1325 |
//rc = EINVAL; |
1325 |
goto out; |
1326 |
goto out; |
1326 |
} |
1327 |
} |
1327 |
|
1328 |
|
Lines 1382-1387
Link Here
|
1382 |
} |
1383 |
} |
1383 |
|
1384 |
|
1384 |
/** |
1385 |
/** |
|
|
1386 |
* check_user_devicemapper |
1387 |
* |
1388 |
* Check if this disk is a User created DM device. |
1389 |
**/ |
1390 |
static int check_user_devicemapper(storage_object_t * disk) |
1391 |
{ |
1392 |
dm_device_list_t * dm_list, * dm_entry; |
1393 |
dm_target_t * targets = NULL; |
1394 |
local_disk_t * ld = disk->private_data; |
1395 |
int rc = 0, dm_user_targets_count = 0, i, dmup_len; |
1396 |
boolean user_dm_enable; |
1397 |
const char * const * dm_user_targets; |
1398 |
char * dm_user_prefix = "dm/"; |
1399 |
|
1400 |
LOG_ENTRY(); |
1401 |
|
1402 |
/* Get the list of active DM devices. */ |
1403 |
dm_list = get_dm_device_list(); |
1404 |
if (!dm_list) { |
1405 |
LOG_WARNING("Cannot get list of DM devices.\n"); |
1406 |
goto out; |
1407 |
} |
1408 |
|
1409 |
/* Search the DM list for an entry that matches this disk. */ |
1410 |
dm_entry = find_disk_in_dm_devices(disk, dm_list); |
1411 |
if (!dm_entry) { |
1412 |
LOG_DEBUG("Disk %s is not a DM device.\n", disk->name); |
1413 |
goto out; |
1414 |
} |
1415 |
|
1416 |
user_dm_enable = FALSE; |
1417 |
EngFncs->get_config_bool("devmapper.dm_user", &user_dm_enable); |
1418 |
|
1419 |
EngFncs->get_config_string_array("devmapper.dm_user_targets", |
1420 |
&dm_user_targets_count, &dm_user_targets); |
1421 |
|
1422 |
if (user_dm_enable == FALSE) { |
1423 |
LOG_DEBUG("devmapper.dm_user not enabled.\n"); |
1424 |
rc = EINVAL; |
1425 |
goto out; |
1426 |
} |
1427 |
|
1428 |
/* search the named targets in the config for the DM name*/ |
1429 |
user_dm_enable = FALSE; |
1430 |
for (i = 0; i < dm_user_targets_count; i++) { |
1431 |
if (strncmp(dm_user_targets[i], dm_entry->name, EVMS_NAME_SIZE) == 0) { |
1432 |
user_dm_enable = TRUE; |
1433 |
} |
1434 |
} |
1435 |
|
1436 |
if (user_dm_enable == FALSE) { |
1437 |
LOG_DEBUG("%s not found in devmapper.dm_user_targets.\n", dm_entry->name); |
1438 |
rc = EINVAL; |
1439 |
goto out; |
1440 |
} |
1441 |
|
1442 |
/* Get the DM mapping for this disk. */ |
1443 |
/* we can use this in the future if we need to, and it's good to check */ |
1444 |
strncpy(disk->name, dm_entry->name, EVMS_NAME_SIZE); |
1445 |
rc = EngFncs->dm_get_targets(disk, &targets); |
1446 |
if (rc) { |
1447 |
LOG_ERROR("Error getting DM mapping for disk %s.\n", disk->name); |
1448 |
goto out; |
1449 |
} |
1450 |
|
1451 |
/* Copy the DM name to this disk. */ |
1452 |
dmup_len = strlen(dm_user_prefix); |
1453 |
LOG_DEBUG("Changing disk name from %s to %s%s.\n", |
1454 |
disk->name, dm_user_prefix ,dm_entry->name); |
1455 |
|
1456 |
strncpy(disk->name, dm_user_prefix, dmup_len); |
1457 |
strncpy((disk->name)+dmup_len, dm_entry->name, EVMS_NAME_SIZE-dmup_len); |
1458 |
|
1459 |
/* Reject all multipath devices that |
1460 |
* were created by other EVMS plugins. |
1461 |
*/ |
1462 |
rc = check_multipath_name(disk); |
1463 |
if (rc) { |
1464 |
LOG_DEBUG("Multipath disk %s belongs to another EVMS plugin.\n", |
1465 |
disk->name); |
1466 |
goto out; |
1467 |
} |
1468 |
|
1469 |
ld->flags |= LD_FLAG_USERDM; |
1470 |
|
1471 |
out: |
1472 |
/*EngFncs->dm_deallocate_targets(targets); */ |
1473 |
LOG_EXIT_INT(rc); |
1474 |
return rc; |
1475 |
} |
1476 |
|
1477 |
/** |
1385 |
* get_geometry |
1478 |
* get_geometry |
1386 |
* |
1479 |
* |
1387 |
* Use the HDIO_GETGEO_BIG or HDIO_GETGEO ioctl to get the disk's geometry. |
1480 |
* Use the HDIO_GETGEO_BIG or HDIO_GETGEO ioctl to get the disk's geometry. |
Lines 1445-1450
Link Here
|
1445 |
if (disk->dev_major == LOOP_MAJOR || |
1538 |
if (disk->dev_major == LOOP_MAJOR || |
1446 |
disk->dev_major == NBD_MAJOR || |
1539 |
disk->dev_major == NBD_MAJOR || |
1447 |
disk->dev_major == DRBD_MAJOR || |
1540 |
disk->dev_major == DRBD_MAJOR || |
|
|
1541 |
ld->flags & LD_FLAG_USERDM || |
1448 |
ld->flags & LD_FLAG_MULTIPATH) { |
1542 |
ld->flags & LD_FLAG_MULTIPATH) { |
1449 |
LOG_DEBUG("Creating fake geometry for disk %s.\n", disk->name); |
1543 |
LOG_DEBUG("Creating fake geometry for disk %s.\n", disk->name); |
1450 |
disk->geometry.heads = 255; |
1544 |
disk->geometry.heads = 255; |
Lines 1709-1714
Link Here
|
1709 |
continue; |
1803 |
continue; |
1710 |
} |
1804 |
} |
1711 |
|
1805 |
|
|
|
1806 |
/* Check for User created DM devices. */ |
1807 |
rc = check_user_devicemapper(&working_disk); |
1808 |
if (rc) { |
1809 |
close_dev(&working_disk); |
1810 |
continue; |
1811 |
} |
1812 |
|
1712 |
/* Get the disk's geometry. */ |
1813 |
/* Get the disk's geometry. */ |
1713 |
rc = get_geometry(&working_disk); |
1814 |
rc = get_geometry(&working_disk); |
1714 |
if (rc) { |
1815 |
if (rc) { |