[libmultipath] more explicit dm-prereq() output
authorroot <root@xa-s05.(none)>
Thu, 14 Jul 2005 20:19:00 +0000 (22:19 +0200)
committerroot <root@xa-s05.(none)>
Thu, 14 Jul 2005 20:19:00 +0000 (22:19 +0200)
"prerequisite not met" was just not informative enough, as
proven by the mailing list traffic about that.

libmultipath/devmapper.c
multipath/main.c

index d8777cf..ec20142 100644 (file)
 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;
 }
index 6a5ac08..fc4718c 100644 (file)
@@ -864,10 +864,9 @@ main (int argc, char *argv[])
                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);