From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7573 invoked by alias); 13 Jan 2010 01:52:59 -0000 Received: (qmail 7528 invoked by uid 9805); 13 Jan 2010 01:52:58 -0000 Date: Wed, 13 Jan 2010 01:52:00 -0000 Message-ID: <20100113015258.7526.qmail@sourceware.org> From: snitzer@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/lib/metadata lv_manip.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: 2010-01/txt/msg00074.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: snitzer@sourceware.org 2010-01-13 01:52:58 Modified files: lib/metadata : lv_manip.c Log message: When turning merging origin into non-merging origin, there is bad sequence: snapshots are suspended, new origin is created, snapshots are resumed, new origin is resumed. So it allocates memory while suspended. To fix it, move vg_commit after suspend_lv, so that the suspend code will treat it as precommitted vg and will preload new origin prior to suspend. NOTE: agk doesn't like this "hack"; need to revisit and fix Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/lv_manip.c.diff?cvsroot=lvm2&r1=1.199&r2=1.200 --- LVM2/lib/metadata/lv_manip.c 2010/01/13 01:51:45 1.199 +++ LVM2/lib/metadata/lv_manip.c 2010/01/13 01:52:58 1.200 @@ -2140,19 +2140,28 @@ } /* store it on disks */ - if (!vg_write(vg) || !vg_commit(vg)) + if (!vg_write(vg)) return_0; - backup(vg); - /* If no snapshots left or if we stopped merging, reload */ if (origin && (!lv_is_origin(origin) || was_merging)) { - if (!suspend_lv(cmd, origin)) + if (!suspend_lv(cmd, origin)) { log_error("Failed to refresh %s without snapshot.", origin->name); - else if (!resume_lv(cmd, origin)) + return 0; + } + if (!vg_commit(vg)) + return_0; + if (!resume_lv(cmd, origin)) { log_error("Failed to resume %s.", origin->name); + return 0; + } + } else { + if (!vg_commit(vg)) + return_0; } + backup(vg); + if (lv_is_visible(lv)) log_print("Logical volume \"%s\" successfully removed", lv->name);