From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14231 invoked by alias); 10 Apr 2008 21:34:55 -0000 Received: (qmail 14215 invoked by uid 9657); 10 Apr 2008 21:34:54 -0000 Date: Thu, 10 Apr 2008 21:34:00 -0000 Message-ID: <20080410213454.14213.qmail@sourceware.org> From: wysochanski@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/tools vgsplit.c Mailing-List: contact lvm2-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: lvm2-cvs-owner@sourceware.org X-SW-Source: 2008-04/txt/msg00049.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: wysochanski@sourceware.org 2008-04-10 21:34:53 Modified files: tools : vgsplit.c Log message: Update vgsplit to only restrict split with active LVs involved in split. Existing code will reject a vgsplit if any LVs in the source VG are active. This patch updates vgsplit to only check LVs involved in the split. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/vgsplit.c.diff?cvsroot=lvm2&r1=1.64&r2=1.65 --- LVM2/tools/vgsplit.c 2008/04/10 20:02:04 1.64 +++ LVM2/tools/vgsplit.c 2008/04/10 21:34:53 1.65 @@ -93,7 +93,7 @@ return 0; } -static void _move_one_lv(struct volume_group *vg_from, +static int _move_one_lv(struct volume_group *vg_from, struct volume_group *vg_to, struct list *lvh) { @@ -101,6 +101,11 @@ list_move(&vg_to->lvs, lvh); + if (lv_is_active(lv)) { + log_error("Logical volume \"%s\" must be inactive", lv->name); + return 0; + } + if (lv->status & SNAPSHOT) { vg_from->snapshot_count--; vg_to->snapshot_count++; @@ -108,6 +113,7 @@ vg_from->lv_count--; vg_to->lv_count++; } + return 1; } static int _move_lvs(struct volume_group *vg_from, struct volume_group *vg_to) @@ -168,7 +174,8 @@ continue; /* Move this LV */ - _move_one_lv(vg_from, vg_to, lvh); + if (!_move_one_lv(vg_from, vg_to, lvh)) + return 0; } /* FIXME Ensure no LVs contain segs pointing at LVs in the other VG */ @@ -212,8 +219,10 @@ * in vg_to. */ if (_lv_is_in_vg(vg_to, seg->cow) && - _lv_is_in_vg(vg_to, seg->origin)) - _move_one_lv(vg_from, vg_to, lvh); + _lv_is_in_vg(vg_to, seg->origin)) { + if (!_move_one_lv(vg_from, vg_to, lvh)) + return 0; + } } } @@ -252,8 +261,10 @@ return 0; } - if (seg_in == seg->area_count && log_in) - _move_one_lv(vg_from, vg_to, lvh); + if (seg_in == seg->area_count && log_in) { + if (!_move_one_lv(vg_from, vg_to, lvh)) + return 0; + } } return 1; @@ -277,7 +288,6 @@ char *vg_name_from, *vg_name_to; struct volume_group *vg_to, *vg_from; int opt; - int active; int existing_vg; int consistent; const char *lv_name; @@ -316,14 +326,6 @@ CORRECT_INCONSISTENT | FAIL_INCONSISTENT))) return ECMD_FAILED; - if ((active = lvs_in_vg_activated(vg_from))) { - /* FIXME Remove this restriction */ - log_error("Logical volumes in \"%s\" must be inactive", - vg_name_from); - unlock_vg(cmd, vg_name_from); - return ECMD_FAILED; - } - log_verbose("Checking for new volume group \"%s\"", vg_name_to); if (!lock_vol(cmd, vg_name_to, LCK_VG_WRITE | LCK_NONBLOCK)) { log_error("Can't get lock for %s", vg_name_to);