public inbox for lvm2-cvs@sourceware.org help / color / mirror / Atom feed
From: wysochanski@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/tools vgsplit.c Date: Wed, 02 Sep 2009 21:26:00 -0000 [thread overview] Message-ID: <20090902212634.12346.qmail@sourceware.org> (raw) CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: wysochanski@sourceware.org 2009-09-02 21:26:34 Modified files: tools : vgsplit.c Log message: Refactor vgsplit - create _vgsplit_to function which creates or opens dest vg. 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> Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/vgsplit.c.diff?cvsroot=lvm2&r1=1.88&r2=1.89 --- LVM2/tools/vgsplit.c 2009/09/02 21:26:18 1.88 +++ LVM2/tools/vgsplit.c 2009/09/02 21:26:34 1.89 @@ -198,6 +198,52 @@ } /* + * 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? */ static int new_vg_option_specified(struct cmd_context *cmd) @@ -262,40 +308,11 @@ */ 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 "
next reply other threads:[~2009-09-02 21:26 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2009-09-02 21:26 wysochanski [this message] -- strict thread matches above, loose matches on Subject: below -- 2009-09-02 21:27 wysochanski 2009-09-02 21:27 wysochanski 2009-09-02 21:26 wysochanski 2009-09-02 21:26 wysochanski 2009-09-02 21:26 wysochanski 2009-09-02 21:25 wysochanski 2009-07-09 5:41 wysochanski 2009-07-08 14:27 wysochanski 2009-07-01 17:04 wysochanski 2009-06-10 11:21 mbroz 2009-06-09 14:31 wysochanski 2008-04-15 14:57 agk 2008-04-10 21:34 wysochanski 2008-04-10 20:02 agk 2008-04-10 2:15 wysochanski 2008-04-10 1:30 wysochanski 2008-02-29 0:13 wysochanski 2008-01-22 3:49 wysochanski 2008-01-11 20:17 wysochanski 2007-11-15 2:53 agk 2007-07-23 21:10 wysochanski
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20090902212634.12346.qmail@sourceware.org \ --to=wysochanski@sourceware.org \ --cc=lvm-devel@redhat.com \ --cc=lvm2-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).