[libmultipath] devmapper prereq detection overhault
authorroot <root@zezette.localdomain>
Mon, 11 Dec 2006 23:05:13 +0000 (00:05 +0100)
committerroot <root@zezette.localdomain>
Mon, 11 Dec 2006 23:05:13 +0000 (00:05 +0100)
o fix testing logic (1.2.0 now satisfies 1.1.1 prereq)
o add libdevmapper prereq testing
o split dm_prereq() in dm_libprereq() and dm_drvprereq()
o bring back min version settings in devmapper.c
o bump libdevmapper prereq to 1.02.11 (in preparation of no_flush use)

libmultipath/devmapper.c
libmultipath/devmapper.h
multipath/main.c

index b8571ad..2ecfba4 100644 (file)
@@ -27,7 +27,6 @@
 #define UUID_PREFIX "mpath-"
 #define UUID_PREFIX_LEN 6
 
-
 static void
 dm_dummy_log (int level, const char *file, int line, const char *f, ...)
 {
@@ -46,13 +45,35 @@ dm_shut_log (void)
        dm_log_init(&dm_dummy_log);
 }
 
-extern int
-dm_prereq (char * str, int x, int y, int z)
+static int
+dm_libprereq (void)
+{
+       char version[64];
+       int v[3];
+       int minv[3] = {1, 2, 11};
+
+       dm_get_library_version(version, sizeof(version));
+       condlog(3, "libdevmapper version %s", version);
+       sscanf(version, "%d.%d.%d ", &v[0], &v[1], &v[2]);
+
+       if ((v[0] > minv[0]) ||
+           ((v[0] ==  minv[0]) && (v[1] > minv[1])) ||
+           ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2])))
+               return 0;
+       condlog(0, "libdevmapper version must be >= %d.%.2d.%.2d",
+               minv[0], minv[1], minv[2]);
+       return 1;
+}
+
+static int
+dm_drvprereq (char * str)
 {
        int r = 2;
        struct dm_task *dmt;
        struct dm_versions *target;
        struct dm_versions *last_target;
+       int minv[3] = {1, 0, 3};
+       unsigned int *v;
 
        if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
                return 3;
@@ -63,37 +84,44 @@ dm_prereq (char * str, int x, int y, int z)
                condlog(0, "Can not communicate with kernel DM");
                goto out;
        }
-
        target = dm_task_get_versions(dmt);
 
        do {
                last_target = target;
-
                if (!strncmp(str, target->name, strlen(str))) {
-                       r--;
-                       
-                       if (target->version[0] >= x &&
-                           target->version[1] >= y &&
-                           target->version[2] >= z)
-                               r--;
-
+                       r = 1;
                        break;
                }
-
                target = (void *) target + target->next;
        } while (last_target != target);
 
-       if (r == 2)
+       if (r == 2) {
                condlog(0, "DM multipath kernel driver not loaded");
-       else if (r == 1)
-               condlog(0, "DM multipath kernel driver version too old");
-
+               goto out;
+       }
+       v = target->version;
+       if ((v[0] > minv[0]) ||
+           ((v[0] == minv[0]) && (v[1] > minv[1])) ||
+           ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2]))) {
+               r = 0;
+               goto out;
+       }
+       condlog(0, "DM multipath kernel driver must be >= %u.%.2u.%.2u",
+               minv[0], minv[1], minv[2]);
 out:
        dm_task_destroy(dmt);
        return r;
 }
 
 extern int
+dm_prereq (char * str)
+{
+       if (dm_libprereq())
+               return 1;
+       return dm_drvprereq(str);
+}
+
+extern int
 dm_simplecmd (int task, const char *name) {
        int r = 0;
        struct dm_task *dmt;
index c7879a7..c023cd4 100644 (file)
@@ -1,6 +1,6 @@
 void dm_shut_log(void);
 void dm_restore_log(void);
-int dm_prereq (char *, int, int, int);
+int dm_prereq (char *);
 int dm_simplecmd (int, const char *);
 int dm_addmap (int, const char *, const char *, const char *,
               unsigned long long, const char *uuid);
index 47ec5a8..62263a9 100644 (file)
@@ -316,7 +316,7 @@ main (int argc, char *argv[])
                exit(1);
        }
 
-       if (dm_prereq(DEFAULT_TARGET, 1, 0, 3))
+       if (dm_prereq(DEFAULT_TARGET))
                exit(1);
 
        if (sysfs_get_mnt_path(sysfs_path, FILE_NAME_SIZE)) {