]> sourceware.org Git - lvm2.git/commitdiff
Refactor vgsplit - create _vgsplit_to function which creates or opens dest vg.
authorDave Wysochanski <dwysocha@redhat.com>
Wed, 2 Sep 2009 21:26:34 +0000 (21:26 +0000)
committerDave Wysochanski <dwysocha@redhat.com>
Wed, 2 Sep 2009 21:26:34 +0000 (21:26 +0000)
Move the creating/opening of the destination vg into its own function so later
we can reorder the source / destination vg opening based on the alphabetical
lock order rule.

Should be no functional change but code is a bit tricky.

Author: Dave Wysochanski <dwysocha@redhat.com>

tools/vgsplit.c

index 1a9e45e0e9cbe5cd48bc00e07865c7d831e8ee31..508d54721019e393c37dff8d34f56670b022bad8 100644 (file)
@@ -197,6 +197,52 @@ static int _move_mirrors(struct volume_group *vg_from,
        return 1;
 }
 
+/*
+ * Create or open the destination of the vgsplit operation.
+ * Returns
+ * - non-NULL: VG handle w/VG lock held
+ * - NULL: no VG lock held
+ */
+static struct volume_group *_vgsplit_to(struct cmd_context *cmd,
+                                       const char *vg_name_to,
+                                       int *existing_vg)
+{
+       struct volume_group *vg_to = NULL;
+
+       log_verbose("Checking for new volume group \"%s\"", vg_name_to);
+       /*
+        * First try to create a new VG.  If we cannot create it,
+        * and we get FAILED_EXIST (we will not be holding a lock),
+        * a VG must already exist with this name.  We then try to
+        * read the existing VG - the vgsplit will be into an existing VG.
+        *
+        * Otherwise, if the lock was successful, it must be the case that
+        * we obtained a WRITE lock and could not find the vgname in the
+        * system.  Thus, the split will be into a new VG.
+        */
+       vg_to = vg_create(cmd, vg_name_to);
+       if (vg_read_error(vg_to) == FAILED_LOCKING) {
+               log_error("Can't get lock for %s", vg_name_to);
+               vg_release(vg_to);
+               return NULL;
+       }
+       if (vg_read_error(vg_to) == FAILED_EXIST) {
+               *existing_vg = 1;
+               vg_release(vg_to);
+               vg_to = vg_read_for_update(cmd, vg_name_to, NULL, 0);
+
+               if (vg_read_error(vg_to)) {
+                       vg_release(vg_to);
+                       stack;
+                       return NULL;
+               }
+
+       } else if (vg_read_error(vg_to) == SUCCESS) {
+               *existing_vg = 0;
+       }
+       return vg_to;
+}
+
 /*
  * Has the user given an option related to a new vg as the split destination?
  */
@@ -262,40 +308,11 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
         */
        cmd->fmt = vg_from->fid->fmt;
 
-       log_verbose("Checking for new volume group \"%s\"", vg_name_to);
-       /*
-        * First try to create a new VG.  If we cannot create it,
-        * and we get FAILED_EXIST (we will not be holding a lock),
-        * a VG must already exist with this name.  We then try to
-        * read the existing VG - the vgsplit will be into an existing VG.
-        *
-        * Otherwise, if the lock was successful, it must be the case that
-        * we obtained a WRITE lock and could not find the vgname in the
-        * system.  Thus, the split will be into a new VG.
-        */
-       vg_to = vg_create(cmd, vg_name_to);
-       if (vg_read_error(vg_to) == FAILED_LOCKING) {
-               log_error("Can't get lock for %s", vg_name_to);
-               vg_release(vg_to);
+       vg_to = _vgsplit_to(cmd, vg_name_to, &existing_vg);
+       if (!vg_to) {
                unlock_and_release_vg(cmd, vg_from, vg_name_from);
                return ECMD_FAILED;
        }
-       if (vg_read_error(vg_to) == FAILED_EXIST) {
-               existing_vg = 1;
-               vg_release(vg_to);
-               vg_to = vg_read_for_update(cmd, vg_name_to, NULL, 0);
-
-               if (vg_read_error(vg_to)) {
-                       vg_release(vg_to);
-                       stack;
-                       unlock_and_release_vg(cmd, vg_from, vg_name_from);
-                       return ECMD_FAILED;
-               }
-
-       } else if (vg_read_error(vg_to) == SUCCESS) {
-               existing_vg = 0;
-       }
-
        if (existing_vg) {
                if (new_vg_option_specified(cmd)) {
                        log_error("Volume group \"%s\" exists, but new VG "
This page took 0.038451 seconds and 5 git commands to generate.