]> sourceware.org Git - lvm2.git/commitdiff
Set block_on_error parameter if available.
authorAlasdair Kergon <agk@redhat.com>
Mon, 19 Dec 2005 21:01:39 +0000 (21:01 +0000)
committerAlasdair Kergon <agk@redhat.com>
Mon, 19 Dec 2005 21:01:39 +0000 (21:01 +0000)
Add target_version.

WHATS_NEW
lib/activate/activate.c
lib/activate/activate.h
lib/mirror/mirrored.c

index ca3cf112059a0a375f5d87745eeccfa48c69df44..9bbe92844684514f5b8f1d25ee1abedc05eb0549 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,7 @@
 Version 2.02.02 - 
 ====================================
+  Set block_on_error parameter if available.
+  Add target_version.
   Add details to format1 'Invalid LV in extent map' error message.
   Fix lvscan snapshot full display.
   Bring lvdisplay man page example into line.
index 3bb3a3f98e086159e6fcd74df5113ec6c630f089..d7de8ea04f9d39addeb718023cec63b0479eabd3 100644 (file)
@@ -76,6 +76,11 @@ int driver_version(char *version, size_t size)
 {
        return 0;
 }
+int target_version(const char *target_name, uint32_t *maj,
+                  uint32_t *min, uint32_t *patchlevel)
+{
+       return 0;
+}
 int target_present(const char *target_name)
 {
        return 0;
@@ -278,7 +283,8 @@ int driver_version(char *version, size_t size)
        return dm_driver_version(version, size);
 }
 
-static int _target_present(const char *target_name)
+int target_version(const char *target_name, uint32_t *maj,
+                  uint32_t *min, uint32_t *patchlevel)
 {
        int r = 0;
        struct dm_task *dmt;
@@ -301,6 +307,9 @@ static int _target_present(const char *target_name)
 
                if (!strcmp(target_name, target->name)) {
                        r = 1;
+                       *maj = target->version[0];
+                       *min = target->version[1];
+                       *patchlevel = target->version[2];
                        goto out;
                }
 
@@ -315,6 +324,7 @@ static int _target_present(const char *target_name)
 
 int target_present(const char *target_name, int use_modprobe)
 {
+       uint32_t maj, min, patchlevel;
 #ifdef MODPROBE_CMD
        char module[128];
 #endif
@@ -324,7 +334,7 @@ int target_present(const char *target_name, int use_modprobe)
 
 #ifdef MODPROBE_CMD
        if (use_modprobe) {
-               if (_target_present(target_name))
+               if (target_version(target_name, &maj, &min, &patchlevel))
                        return 1;
 
                if (lvm_snprintf(module, sizeof(module), "dm-%s", target_name)
@@ -339,7 +349,7 @@ int target_present(const char *target_name, int use_modprobe)
        }
 #endif
 
-       return _target_present(target_name);
+       return target_version(target_name, &maj, &min, &patchlevel);
 }
 
 /*
@@ -580,7 +590,7 @@ static int _register_dev(struct cmd_context *cmd, struct logical_volume *lv,
                if (do_reg) {
                        if (seg->segtype->ops->target_register_events)
                                reg = seg->segtype->ops->target_register_events;
-               } else if(seg->setype->ops->target_unregister_events)
+               } else if (seg->segtype->ops->target_unregister_events)
                        reg = seg->segtype->ops->target_unregister_events;
 
                if (reg)
index c05f667daa9a327133b56fd16b7727db24f908cf..0a62c322a421770883753a507536959e3f37314e 100644 (file)
@@ -37,6 +37,8 @@ int library_version(char *version, size_t size);
 int lvm1_present(struct cmd_context *cmd);
 
 int target_present(const char *target_name, int use_modprobe);
+int target_version(const char *target_name, uint32_t *maj,
+                   uint32_t *min, uint32_t *patchlevel);
 
 void activation_exit(void);
 
index a45f95befd580b7992996031606576c5a2f22b5d..5f539bc07c1d4832ba94e8247a526c40f767d119 100644 (file)
@@ -27,6 +27,8 @@
 #include "activate.h"
 #include "libdevmapper-event.h"
 
+static int _block_on_error_available = 0;
+
 enum {
        MIRR_DISABLED,
        MIRR_RUNNING,
@@ -239,12 +241,10 @@ static int _add_log(struct dev_manager *dm, struct lv_segment *seg,
                return 0;
        }
 
-       /* FIXME Only if the kernel supports this 
-       if (!(seg->status & PVMOVE))
+       if (_block_on_error_available && !(seg->status & PVMOVE))
                log_flags |= DM_BLOCK_ON_ERROR;
-       */
 
-       return dm_tree_node_add_mirror_target_log(node, region_size, clustered, log_flags, log_dlid, area_count);
+       return dm_tree_node_add_mirror_target_log(node, region_size, clustered, log_dlid, area_count, log_flags);
 }
 
 static int _add_target_line(struct dev_manager *dm, struct dm_pool *mem,
@@ -322,10 +322,27 @@ static int _target_present(void)
 {
        static int checked = 0;
        static int present = 0;
+       uint32_t maj, min, patchlevel;
+       unsigned maj2, min2;
+        char vsn[80];
 
-       if (!checked)
+       if (!checked) {
                present = target_present("mirror", 1);
 
+               /*
+                * block_on_error available with mirror target >= 1.1
+                * or with 1.0 in RHEL4U3 driver >= 4.5
+                */
+
+               if (target_version("mirror", &maj, &min, &patchlevel) &&
+                   maj == 1 && 
+                   (min >= 1 || 
+                    (min == 0 && driver_version(vsn, sizeof(vsn)) &&
+                     sscanf(vsn, "%u.%u", &maj2, &min2) == 2 &&
+                     maj2 >= 4 && min2 >= 5))) /* RHEL4U3 */
+                       _block_on_error_available = 1;
+       }
+
        checked = 1;
 
        return present;
This page took 0.046144 seconds and 5 git commands to generate.