]> sourceware.org Git - lvm2.git/commitdiff
Only fail if the top-level LV fails to be deactivated - allow deactivation
authorAlasdair Kergon <agk@redhat.com>
Wed, 7 Apr 2010 23:51:34 +0000 (23:51 +0000)
committerAlasdair Kergon <agk@redhat.com>
Wed, 7 Apr 2010 23:51:34 +0000 (23:51 +0000)
of its dependencies to fail.

libdm/libdm-deptree.c

index d4beeac511e0404798eac5540de7df3fb76f04a1..eb7434068d5300b73e8d52364d0e818f698893fe 100644 (file)
@@ -1013,9 +1013,13 @@ static int _suspend_node(const char *name, uint32_t major, uint32_t minor,
        return r;
 }
 
-int dm_tree_deactivate_children(struct dm_tree_node *dnode,
-                                  const char *uuid_prefix,
-                                  size_t uuid_prefix_len)
+/*
+ * FIXME Don't attempt to deactivate known internal dependencies.
+ */
+static int _dm_tree_deactivate_children(struct dm_tree_node *dnode,
+                                       const char *uuid_prefix,
+                                       size_t uuid_prefix_len,
+                                       unsigned level)
 {
        int r = 1;
        void *handle = NULL;
@@ -1051,10 +1055,13 @@ int dm_tree_deactivate_children(struct dm_tree_node *dnode,
                        continue;
 
                if (info.open_count) {
-                       log_error("Unable to deactivate open %s (%" PRIu32
-                                 ":%" PRIu32 ")", name, info.major,
-                                 info.minor);
-                       r = 0;
+                       /* Only report error from (likely non-internal) dependency at top level */
+                       if (!level) {
+                               log_error("Unable to deactivate open %s (%" PRIu32
+                                         ":%" PRIu32 ")", name, info.major,
+                                       info.minor);
+                               r = 0;
+                       }
                        continue;
                }
 
@@ -1067,14 +1074,22 @@ int dm_tree_deactivate_children(struct dm_tree_node *dnode,
                        continue;
                }
 
-               if (dm_tree_node_num_children(child, 0))
-                       if (!dm_tree_deactivate_children(child, uuid_prefix, uuid_prefix_len))
+               if (dm_tree_node_num_children(child, 0)) {
+                       if (!_dm_tree_deactivate_children(child, uuid_prefix, uuid_prefix_len, level + 1))
                                return_0;
+               }
        }
 
        return r;
 }
 
+int dm_tree_deactivate_children(struct dm_tree_node *dnode,
+                                  const char *uuid_prefix,
+                                  size_t uuid_prefix_len)
+{
+       return _dm_tree_deactivate_children(dnode, uuid_prefix, uuid_prefix_len, 0);
+}
+
 void dm_tree_skip_lockfs(struct dm_tree_node *dnode)
 {
        dnode->dtree->skip_lockfs = 1;
This page took 0.041611 seconds and 5 git commands to generate.