extern int
dm_prereq (char * str, int x, int y, int z)
{
- int r = 1;
+ int r = 2;
struct dm_task *dmt;
struct dm_versions *target;
struct dm_versions *last_target;
if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
- return 1;
+ return 3;
dm_task_no_open_count(dmt);
- if (!dm_task_run(dmt))
+ if (!dm_task_run(dmt)) {
+ condlog(0, "Can not communicate with kernel DM");
goto out;
+ }
target = dm_task_get_versions(dmt);
- /* Fetch targets and print 'em */
do {
last_target = target;
- if (!strncmp(str, target->name, strlen(str)) &&
- /* dummy prereq on multipath version */
- target->version[0] >= x &&
- target->version[1] >= y &&
- target->version[2] >= z
- )
- r = 0;
+ if (!strncmp(str, target->name, strlen(str))) {
+ r--;
+
+ if (target->version[0] >= x &&
+ target->version[1] >= y &&
+ target->version[2] >= z)
+ r--;
+
+ break;
+ }
target = (void *) target + target->next;
} while (last_target != target);
- out:
+ if (r == 2)
+ condlog(0, "DM multipath kernel driver not loaded");
+ else if (r == 1)
+ condlog(0, "DM multipath kernel driver version too old");
+
+out:
dm_task_destroy(dmt);
return r;
}
exit(1);
}
- if (dm_prereq(DEFAULT_TARGET, 1, 0, 3)) {
- condlog(0, "device mapper prerequisites not met");
+ if (dm_prereq(DEFAULT_TARGET, 1, 0, 3))
exit(1);
- }
+
if (sysfs_get_mnt_path(sysfs_path, FILE_NAME_SIZE)) {
condlog(0, "multipath tools need sysfs mounted");
exit(1);