]> sourceware.org Git - lvm2.git/commitdiff
Fix lvscan snapshot full display.
authorAlasdair Kergon <agk@redhat.com>
Thu, 8 Dec 2005 17:49:34 +0000 (17:49 +0000)
committerAlasdair Kergon <agk@redhat.com>
Thu, 8 Dec 2005 17:49:34 +0000 (17:49 +0000)
dmeventd fixes

WHATS_NEW
lib/activate/activate.c
lib/metadata/segtype.h
lib/mirror/mirrored.c
tools/Makefile.in
tools/lvscan.c
tools/pvcreate.c

index c255f7f0d1f5b45d5481ae1ffeb73786bbfd9292..7866e3cf8adf5f2e319631141987925fccd95d52 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.02 - 
 ====================================
+  Fix lvscan snapshot full display.
   Bring lvdisplay man page example into line.
   Add mirror dmeventd library.
   Add some activation logic to remove_mirror_images().
index f3737a320e4428951ccbedbc96e22d3e10aaf395..3bb3a3f98e086159e6fcd74df5113ec6c630f089 100644 (file)
@@ -577,10 +577,11 @@ static int _register_dev(struct cmd_context *cmd, struct logical_volume *lv,
        list_iterate(tmp, &lv->segments) {
                seg = list_item(tmp, struct lv_segment);
 
-               if (do_reg)
-                       reg = seg->segtype->ops->target_register;
-               else
-                       reg = seg->segtype->ops->target_unregister;
+               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)
+                       reg = seg->segtype->ops->target_unregister_events;
 
                if (reg)
                        /* FIXME specify events */
@@ -589,6 +590,7 @@ static int _register_dev(struct cmd_context *cmd, struct logical_volume *lv,
                                return 0;
                        }
        }
+
        return 1;
 }
 #endif
index da107fab33b15d16b1a55a6724b622cec691f01a..608c6cda9b4337fbb3a676f836e4ac50ccd8f2ce 100644 (file)
@@ -78,10 +78,12 @@ struct segtype_handler {
                               uint64_t *total_denominator, float *percent);
        int (*target_present) (void);
        void (*destroy) (const struct segment_type * segtype);
-       int (*target_register) (struct dm_pool *mem, struct lv_segment *seg,
-                               struct config_tree *cft, int events);
-       int (*target_unregister) (struct dm_pool *mem, struct lv_segment *seg,
-                                 struct config_tree *cft, int events);
+       int (*target_register_events) (struct dm_pool *mem,
+                                      struct lv_segment *seg,
+                                      struct config_tree *cft, int events);
+       int (*target_unregister_events) (struct dm_pool *mem,
+                                        struct lv_segment *seg,
+                                        struct config_tree *cft, int events);
 };
 
 struct segment_type *get_segtype_from_string(struct cmd_context *cmd,
index 8142a070715d8e992ff657354243565c517ef52e..f4b566b67e6e0f433e2334e17af6aba1ab9c5f1c 100644 (file)
@@ -341,8 +341,9 @@ static int _setup_registration(struct dm_pool *mem, struct config_tree *cft,
 }
 
 /* FIXME This gets run while suspended and performs banned operations. */
-static int _target_register(struct dm_pool *mem, struct lv_segment *seg,
-                           struct config_tree *cft, int events)
+static int _target_register_events(struct dm_pool *mem,
+                                  struct lv_segment *seg,
+                                  struct config_tree *cft, int events)
 {
        char *dso;
        char dm_name[PATH_MAX];
@@ -362,7 +363,7 @@ static int _target_register(struct dm_pool *mem, struct lv_segment *seg,
        strncpy(dm_name, build_dm_name(mem, vg->name, lv->name, NULL),
                PATH_MAX);
 
-       if((err = dm_event_register(dso, dm_name, ALL_ERRORS)) < 0) {
+       if((err = dm_event_register(dso, dm_name, DM_EVENT_ALL_ERRORS)) < 0) {
                log_error("Unable to register %s for events: %s", dm_name,
                          strerror(-err));
                return 0;
@@ -372,8 +373,9 @@ static int _target_register(struct dm_pool *mem, struct lv_segment *seg,
        return 1;
 }
 
-static int _target_unregister(struct dm_pool *mem, struct lv_segment *seg,
-                             struct config_tree *cft, int events)
+static int _target_unregister_events(struct dm_pool *mem,
+                                    struct lv_segment *seg,
+                                    struct config_tree *cft, int events)
 {
        char *dso;
        char devpath[PATH_MAX];
@@ -424,8 +426,8 @@ static struct segtype_handler _mirrored_ops = {
        target_present:_target_present,
 #endif
 #ifdef DMEVENTD
-       target_register:_target_register,
-       target_unregister:_target_unregister,
+       target_register_events:_target_register_events,
+       target_unregister_events:_target_unregister_events,
 #endif
        destroy:_destroy,
 };
index 55144523cccc384b42f2be61c51a65472c742e71..0041c8a5cbb9a1b866e637d3dfbf77738953d0f7 100644 (file)
@@ -87,12 +87,12 @@ ifeq ("@CMDLIB@", "yes")
        INSTALL_TARGETS += $(INSTALL_CMDLIB_TARGETS)
 endif
 
-ifeq ("@DEVMAPPER@", "yes")
-       LVMLIBS += -ldevmapper
+ifeq ("@DMEVENTD@", "yes")
+       LVMLIBS += -ldevmapper-event -lpthread
 endif
 
-ifeq ("@DMEVENTD@", "yes")
-       LVMLIBS += -ldevmapper-event
+ifeq ("@DEVMAPPER@", "yes")
+       LVMLIBS += -ldevmapper
 endif
 
 CFLAGS += -DLVM_SHARED_PATH=\"$(exec_prefix)/sbin/lvm\"
index d56abe2cbf742d4ca9d408a40068b5ccbfac79ef..41a74674e15b9ded382d19f6395ef5c24126dbf8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. 
- * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
  *
  * This file is part of LVM2.
  *
@@ -21,6 +21,9 @@ static int lvscan_single(struct cmd_context *cmd, struct logical_volume *lv,
        struct lvinfo info;
        int lv_total = 0;
        uint64_t lv_capacity_total = 0;
+       int inkernel, snap_active = 1;
+       struct lv_segment *snap_seg = NULL;
+       float snap_percent;     /* fused, fsize; */
 
        const char *active_str, *snapshot_str;
 
@@ -29,8 +32,27 @@ static int lvscan_single(struct cmd_context *cmd, struct logical_volume *lv,
            !(lv_is_cow(lv)))
                return ECMD_PROCESSED;
 
+       inkernel = lv_info(cmd, lv, &info, 1) && info.exists;
+       if (lv_is_origin(lv)) {
+               list_iterate_items_gen(snap_seg, &lv->snapshot_segs,
+                                      origin_list) {
+                       if (inkernel &&
+                           (snap_active = lv_snapshot_percent(snap_seg->cow,
+                                                              &snap_percent)))
+                               if (snap_percent < 0 || snap_percent >= 100)
+                                       snap_active = 0;
+               }
+               snap_seg = NULL;
+       } else if ((snap_seg = find_cow(lv))) {
+               if (inkernel &&
+                   (snap_active = lv_snapshot_percent(snap_seg->cow,
+                                                      &snap_percent)))
+                       if (snap_percent < 0 || snap_percent >= 100)
+                               snap_active = 0;
+       }
+
 /* FIXME Add -D arg to skip this! */
-       if (lv_info(cmd, lv, &info, 0) && info.exists)
+       if (inkernel && snap_active)
                active_str = "ACTIVE   ";
        else
                active_str = "inactive ";
index 75995dd30f4472beaeb553dd399a0c27128b139b..9fd75719f7d4edbaaa4be3a1995aa1aa9d918f39 100644 (file)
@@ -78,7 +78,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name)
        }
 
        if (!dev) {
-               log_error("Device %s not found.", name);
+               log_error("Device %s not found (or ignored by filtering).", name);
                return 0;
        }
 
This page took 0.054018 seconds and 5 git commands to generate.