Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Maintenance:3693
lvm2.openSUSE_13.1_Update
lvmetad-Fix-autoactivation-for-MDA-less-PVs.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File lvmetad-Fix-autoactivation-for-MDA-less-PVs.patch of Package lvm2.openSUSE_13.1_Update
lvmetad: Fix autoactivation for MDA-less PVs. Calling pvscan --cache with -aay on a PV without an MDA would spuriously fail with an internal error, because of an incorrect assumption that a parsed VG structure was always available. This is not true and the autoactivation handler needs to call vg_read to obtain metadata in cases where the PV had no MDAs to parse. Therefore, we pass vgid into the handler instead of the (possibly NULL) VG coming from the PV's MDA. Index: LVM2.2.02.98/lib/cache/lvmetad.c =================================================================== --- LVM2.2.02.98.orig/lib/cache/lvmetad.c +++ LVM2.2.02.98/lib/cache/lvmetad.c @@ -701,7 +701,7 @@ int lvmetad_pv_found(const struct id *pv daemon_reply reply; struct lvmcache_info *info; struct dm_config_tree *pvmeta, *vgmeta; - const char *status; + const char *status, *vgid; int result; if (!lvmetad_active() || test_mode()) @@ -750,11 +750,6 @@ int lvmetad_pv_found(const struct id *pv NULL); dm_config_destroy(vgmeta); } else { - if (handler) { - log_error(INTERNAL_ERROR "Handler needs existing VG."); - dm_free(pvmeta); - return 0; - } /* There are no MDAs on this PV. */ reply = _lvmetad_send("pv_found", "pvmeta = %t", pvmeta, NULL); } @@ -770,10 +765,11 @@ int lvmetad_pv_found(const struct id *pv if (result && handler) { status = daemon_reply_str(reply, "status", "<missing>"); + vgid = daemon_reply_str(reply, "vgid", "<missing>"); if (!strcmp(status, "partial")) - handler(vg, 1, CHANGE_AAY); + handler(_lvmetad_cmd, vgid, 1, CHANGE_AAY); else if (!strcmp(status, "complete")) - handler(vg, 0, CHANGE_AAY); + handler(_lvmetad_cmd, vgid, 0, CHANGE_AAY); else if (!strcmp(status, "orphan")) ; else Index: LVM2.2.02.98/lib/cache/lvmetad.h =================================================================== --- LVM2.2.02.98.orig/lib/cache/lvmetad.h +++ LVM2.2.02.98/lib/cache/lvmetad.h @@ -22,7 +22,8 @@ struct cmd_context; struct dm_config_tree; enum activation_change; -typedef int (*activation_handler) (struct volume_group *vg, int partial, +typedef int (*activation_handler) (struct cmd_context *cmd, + const char *vgid, int partial, enum activation_change activate); #ifdef LVMETAD_SUPPORT Index: LVM2.2.02.98/test/shell/lvmetad-pvscan-nomda.sh =================================================================== --- /dev/null +++ LVM2.2.02.98/test/shell/lvmetad-pvscan-nomda.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# Copyright (C) 2012 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions +# of the GNU General Public License v.2. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +. lib/test + +test -e LOCAL_LVMETAD || skip +kill $(cat LOCAL_LVMETAD) +rm LOCAL_LVMETAD + +aux prepare_devs 2 + +pvcreate --metadatacopies 0 $dev1 +pvcreate --metadatacopies 1 $dev2 +vgcreate $vg1 $dev1 $dev2 +lvcreate -n foo -l 1 -an --zero n $vg1 + +# start lvmetad but make sure it doesn't know about $dev1 or $dev2 +aux disable_dev $dev1 +aux disable_dev $dev2 +aux prepare_lvmetad +lvs +mv LOCAL_LVMETAD XXX +aux enable_dev $dev2 +aux enable_dev $dev1 +mv XXX LOCAL_LVMETAD + +aux lvmconf 'global/use_lvmetad = 0' +check inactive $vg1 foo +aux lvmconf 'global/use_lvmetad = 1' + +pvscan --cache $dev2 -aay + +aux lvmconf 'global/use_lvmetad = 0' +check inactive $vg1 foo +aux lvmconf 'global/use_lvmetad = 1' + +pvscan --cache $dev1 -aay + +aux lvmconf 'global/use_lvmetad = 0' +check active $vg1 foo +aux lvmconf 'global/use_lvmetad = 1' Index: LVM2.2.02.98/tools/pvscan.c =================================================================== --- LVM2.2.02.98.orig/tools/pvscan.c +++ LVM2.2.02.98/tools/pvscan.c @@ -91,18 +91,36 @@ static void _pvscan_display_single(struc display_size(cmd, (uint64_t) (pv_pe_count(pv) - pv_pe_alloc_count(pv)) * pv_pe_size(pv))); } -static int _auto_activation_handler(struct volume_group *vg, int partial, +static int _auto_activation_handler(struct cmd_context *cmd, + const char *vgid, int partial, activation_change_t activate) { + struct volume_group *vg; + int consistent = 0; + struct id vgid_raw; + /* TODO: add support for partial and clustered VGs */ - if (partial || vg_is_clustered(vg)) + if (partial) return 1; + id_read_format(&vgid_raw, vgid); + /* NB. This is safe because we know lvmetad is running and we won't hit + * disk. */ + if (!(vg = vg_read_internal(cmd, NULL, &vgid_raw, 0, &consistent))) + return 1; + + if (vg_is_clustered(vg)) { + release_vg(vg); + return 1; + } + if (!vgchange_activate(vg->cmd, vg, activate)) { log_error("%s: autoactivation failed.", vg->name); + release_vg(vg); return 0; } + release_vg(vg); return 1; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor