From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4698 invoked by alias); 17 Mar 2010 02:11:20 -0000 Received: (qmail 4684 invoked by uid 9447); 17 Mar 2010 02:11:20 -0000 Date: Wed, 17 Mar 2010 02:11:00 -0000 Message-ID: <20100317021120.4682.qmail@sourceware.org> From: agk@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2 ./WHATS_NEW lib/cache/lvmcache.c lib/cach ... 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-03/txt/msg00036.txt.bz2 CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: agk@sourceware.org 2010-03-17 02:11:19 Modified files: . : WHATS_NEW lib/cache : lvmcache.c lvmcache.h lib/format_text: import-export.h import.c import_vsn1.c Log message: Suppress repeated errors about the same missing PV uuids. Bypass full device scans when using internally-cached VG metadata. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.1464&r2=1.1465 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/cache/lvmcache.c.diff?cvsroot=lvm2&r1=1.81&r2=1.82 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/cache/lvmcache.h.diff?cvsroot=lvm2&r1=1.29&r2=1.30 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/import-export.h.diff?cvsroot=lvm2&r1=1.23&r2=1.24 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/import.c.diff?cvsroot=lvm2&r1=1.48&r2=1.49 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/format_text/import_vsn1.c.diff?cvsroot=lvm2&r1=1.68&r2=1.69 --- LVM2/WHATS_NEW 2010/03/16 17:30:00 1.1464 +++ LVM2/WHATS_NEW 2010/03/17 02:11:18 1.1465 @@ -1,5 +1,7 @@ Version 2.02.63 - ================================ + Suppress repeated errors about the same missing PV uuids. + Bypass full device scans when using internally-cached VG metadata. Only do one full device scan during each read of text format metadata. Remove unnecessary full_scan parameter from get_vgids and get_vgnames calls. Look up missing PVs by uuid not dev_name in _pvs_single to avoid invalid stat. --- LVM2/lib/cache/lvmcache.c 2010/03/16 19:06:57 1.81 +++ LVM2/lib/cache/lvmcache.c 2010/03/17 02:11:18 1.82 @@ -704,7 +704,7 @@ } struct device *device_from_pvid(struct cmd_context *cmd, struct id *pvid, - int *scan_done_once) + unsigned *scan_done_once) { struct label *label; struct lvmcache_info *info; --- LVM2/lib/cache/lvmcache.h 2010/03/16 17:30:01 1.29 +++ LVM2/lib/cache/lvmcache.h 2010/03/17 02:11:18 1.30 @@ -94,7 +94,7 @@ struct lvmcache_info *info_from_pvid(const char *pvid, int valid_only); const char *vgname_from_vgid(struct dm_pool *mem, const char *vgid); struct device *device_from_pvid(struct cmd_context *cmd, struct id *pvid, - int *scan_done_once); + unsigned *scan_done_once); int vgs_locked(void); int vgname_is_locked(const char *vgname); --- LVM2/lib/format_text/import-export.h 2009/11/24 22:55:56 1.23 +++ LVM2/lib/format_text/import-export.h 2010/03/17 02:11:19 1.24 @@ -46,7 +46,8 @@ struct text_vg_version_ops { int (*check_version) (struct config_tree * cf); struct volume_group *(*read_vg) (struct format_instance * fid, - struct config_tree * cf); + struct config_tree * cf, + unsigned use_cached_pvs); void (*read_desc) (struct dm_pool * mem, struct config_tree * cf, time_t *when, char **desc); const char *(*read_vgname) (const struct format_type *fmt, --- LVM2/lib/format_text/import.c 2009/11/24 22:55:56 1.48 +++ LVM2/lib/format_text/import.c 2010/03/17 02:11:19 1.49 @@ -111,7 +111,7 @@ if (!(*vsn)->check_version(cft)) continue; - if (!(vg = (*vsn)->read_vg(fid, cft))) + if (!(vg = (*vsn)->read_vg(fid, cft, 0))) goto_out; (*vsn)->read_desc(fid->fmt->cmd->mem, cft, when, desc); @@ -146,7 +146,11 @@ for (vsn = &_text_vsn_list[0]; *vsn; vsn++) { if (!(*vsn)->check_version(cft)) continue; - if (!(vg = (*vsn)->read_vg(fid, cft))) + /* + * The only path to this point uses cached vgmetadata, + * so it can use cached PV state too. + */ + if (!(vg = (*vsn)->read_vg(fid, cft, 1))) stack; break; } --- LVM2/lib/format_text/import_vsn1.c 2010/03/16 17:30:01 1.68 +++ LVM2/lib/format_text/import_vsn1.c 2010/03/17 02:11:19 1.69 @@ -28,7 +28,8 @@ struct volume_group * vg, struct config_node * pvn, struct config_node * vgn, struct dm_hash_table * pv_hash, - int *scan_done_once); + unsigned *scan_done_once, + unsigned report_missing_devices); #define _read_int32(root, path, result) \ get_config_uint32(root, path, (uint32_t *) result) @@ -154,7 +155,8 @@ static int _read_pv(struct format_instance *fid, struct dm_pool *mem, struct volume_group *vg, struct config_node *pvn, struct config_node *vgn __attribute((unused)), - struct dm_hash_table *pv_hash, int *scan_done_once) + struct dm_hash_table *pv_hash, unsigned *scan_done_once, + unsigned report_missing_devices) { struct physical_volume *pv; struct pv_list *pvl; @@ -191,10 +193,11 @@ char buffer[64] __attribute((aligned(8))); if (!id_write_format(&pv->id, buffer, sizeof(buffer))) - log_error("Couldn't find device."); + buffer[0] = '\0'; + if (report_missing_devices) + log_error("Couldn't find device with uuid %s.", buffer); else - log_error("Couldn't find device with uuid '%s'.", - buffer); + log_very_verbose("Couldn't find device with uuid %s.", buffer); } if (!(pv->vg_name = dm_pool_strdup(mem, vg->name))) @@ -492,7 +495,8 @@ struct volume_group *vg, struct config_node *lvn, struct config_node *vgn __attribute((unused)), struct dm_hash_table *pv_hash __attribute((unused)), - int *scan_done_once __attribute((unused))) + unsigned *scan_done_once __attribute((unused)), + unsigned report_missing_devices __attribute((unused))) { struct logical_volume *lv; struct config_node *cn; @@ -559,7 +563,8 @@ struct volume_group *vg, struct config_node *lvn, struct config_node *vgn __attribute((unused)), struct dm_hash_table *pv_hash, - int *scan_done_once __attribute((unused))) + unsigned *scan_done_once __attribute((unused)), + unsigned report_missing_devices __attribute((unused))) { struct logical_volume *lv; struct lv_list *lvl; @@ -612,10 +617,12 @@ const char *section, section_fn fn, struct dm_pool *mem, struct volume_group *vg, struct config_node *vgn, - struct dm_hash_table *pv_hash, int optional) + struct dm_hash_table *pv_hash, int optional, + unsigned *scan_done_once) { struct config_node *n; - int scan_done_once = 0; + /* Only report missing devices when doing a scan */ + unsigned report_missing_devices = scan_done_once ? !*scan_done_once : 1; if (!(n = find_config_node(vgn, section))) { if (!optional) { @@ -627,7 +634,7 @@ } for (n = n->child; n; n = n->sib) { - if (!fn(fid, mem, vg, n, vgn, pv_hash, &scan_done_once)) + if (!fn(fid, mem, vg, n, vgn, pv_hash, scan_done_once, report_missing_devices)) return_0; } @@ -635,12 +642,14 @@ } static struct volume_group *_read_vg(struct format_instance *fid, - struct config_tree *cft) + struct config_tree *cft, + unsigned use_cached_pvs) { struct config_node *vgn, *cn; struct volume_group *vg; struct dm_hash_table *pv_hash = NULL; struct dm_pool *mem = dm_pool_create("lvm2 vg_read", VG_MEMPOOL_CHUNK); + unsigned scan_done_once = use_cached_pvs; if (!mem) return_NULL; @@ -743,7 +752,7 @@ dm_list_init(&vg->pvs); if (!_read_sections(fid, "physical_volumes", _read_pv, mem, vg, - vgn, pv_hash, 0)) { + vgn, pv_hash, 0, &scan_done_once)) { log_error("Couldn't find all physical volumes for volume " "group %s.", vg->name); goto bad; @@ -761,14 +770,14 @@ } if (!_read_sections(fid, "logical_volumes", _read_lvnames, mem, vg, - vgn, pv_hash, 1)) { + vgn, pv_hash, 1, NULL)) { log_error("Couldn't read all logical volume names for volume " "group %s.", vg->name); goto bad; } if (!_read_sections(fid, "logical_volumes", _read_lvsegs, mem, vg, - vgn, pv_hash, 1)) { + vgn, pv_hash, 1, NULL)) { log_error("Couldn't read all logical volumes for " "volume group %s.", vg->name); goto bad;