Hello community, here is the log from the commit of package lvm2 checked in at Sat Sep 13 05:05:28 CEST 2008. -------- --- lvm2/lvm2.changes 2008-09-03 11:28:27.000000000 +0200 +++ lvm2/lvm2.changes 2008-09-11 16:13:52.000000000 +0200 @@ -0,0 +1,22 @@ +Wed Sep 10 13:43:17 CEST 2008 - xwhu@novell.com +------------------------------------------------------------------- + +- Upgrade to 2.0.39 + Fix up cache for PVs without mdas after consistent VG metadata is processed. + Update validation of safe mirror log type conversions in lvconvert. + Fix lvconvert to disallow snapshot and mirror combinations. + Fix reporting of LV fields alongside unallocated PV segments. + Add --unquoted and --rows to reporting tools. + Avoid undefined return value after _memlock manipulation in lvm2_run. + Avoid link failure if configured without --enable-cmdlib or --enable-readline. + Make clvmd return at once if other nodes down in a gulm or openais cluster. + Fix and improve readahead 'auto' calculation for stripe_size. + Fix lvchange output for -r auto setting if auto is already set. + Fix ambiguous use of identifier error_message_produced. + Fix add_mirror_images not to dereference uninitialized log_lv upon failure. + Don't call openlog for every debug line output by clvmd. + Add --force to lvextend and lvresize. + Fix vgchange to not activate mirror leg and log volumes directly. + Fix test directory clean up in make distclean. +- pvcreate/pvremove/pvchange will create symlinks in /dev/disk/by-id/ + to the device file @@ -32,0 +55,5 @@ +Thu Jul 31 16:13:59 CST 2008 - xwhu@suse.de + +- repack LVM2.2.02.38.tar.bz2 into bz2 format + +------------------------------------------------------------------- Old: ---- LVM2.2.02.38.tar.bz2 New: ---- 64-lvm2.rules collect_lvm LVM2.2.02.39.tar.bz2 lvm-pv-create-link.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ lvm2.spec ++++++ --- /var/tmp/diff_new_pack.J13111/_old 2008-09-13 05:04:24.000000000 +0200 +++ /var/tmp/diff_new_pack.J13111/_new 2008-09-13 05:04:24.000000000 +0200 @@ -1,5 +1,5 @@ # -# spec file for package lvm2 (Version 2.02.38) +# spec file for package lvm2 (Version 2.02.39) # # Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. # @@ -18,7 +18,7 @@ Name: lvm2 -BuildRequires: device-mapper-devel openais-devel +BuildRequires: device-mapper-devel openais-devel readline-devel BuildRequires: libselinux-devel License: GPL v2 or later; LGPL v2.1 or later Group: System/Base @@ -27,8 +27,8 @@ Obsoletes: lvm PreReq: %fillup_prereq %insserv_prereq AutoReqProv: on -Version: 2.02.38 -Release: 26 +Version: 2.02.39 +Release: 1 Summary: LVM2 Tools Source: LVM2.%{version}.tar.bz2 Source1: lvm.conf @@ -36,6 +36,8 @@ Source3: sysconfig.lvm Source4: mkinitrd-setup.sh Source5: mkinitrd-boot.sh +Source6: 64-lvm2.rules +Source7: collect_lvm Patch: improve_probing.diff Patch2: no-inc-audit.diff Patch3: no_buildroot_shared.diff @@ -46,6 +48,7 @@ Patch11: cmdline_large_minor.diff Patch12: enable-clvmd.patch Patch13: pipe_buff-definition.diff +Patch14: lvm-pv-create-link.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build # Not a real replacement but we drop evms Provides: evms = 2.5.5 evms-gui = 2.5.5 evms-devel = 2.5.5 evms-ha = 2.5.5 @@ -80,6 +83,7 @@ %patch11 %patch12 %patch13 +%patch14 -p1 %build CFLAGS="$RPM_OPT_FLAGS" MODPROBE_CMD=/sbin/modprobe \ @@ -101,9 +105,6 @@ install -d -m 755 $RPM_BUILD_ROOT/var/lock/lvm install -D -m 755 $RPM_BUILD_ROOT/sbin/clvmd $RPM_BUILD_ROOT/usr/sbin/clvmd rm $RPM_BUILD_ROOT/sbin/clvmd -rm $RPM_BUILD_ROOT/%_lib/libdevmapper-event-lvm2mirror.so -rm $RPM_BUILD_ROOT/%_lib/libdevmapper-event-lvm2snapshot.so -rm $RPM_BUILD_ROOT/%_lib/liblvm2cmd.so install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/etc/lvm mkdir -p $RPM_BUILD_ROOT/etc/init.d install -m 755 %{SOURCE2} $RPM_BUILD_ROOT/etc/init.d @@ -113,6 +114,9 @@ mkdir -p $RPM_BUILD_ROOT/var/adm/fillup-templates install -m 644 %{SOURCE3} $RPM_BUILD_ROOT/var/adm/fillup-templates rm $RPM_BUILD_ROOT/usr/include/lvm2cmd.h +# install 64-lvm2.rules and collect_lvm +install -m644 -D %{S:6} $RPM_BUILD_ROOT/lib/udev/rules.d/64-lvm2.rules +install -m755 -D %{S:7} $RPM_BUILD_ROOT/lib/udev/collect_lvm %clean rm -rf $RPM_BUILD_ROOT @@ -133,6 +137,7 @@ %files clvm %defattr(-,root,root) /usr/sbin/clvmd +%{_mandir}/man8/clvmd.8.gz %files %defattr(-,root,root) @@ -146,6 +151,8 @@ %config /etc/init.d/boot.lvm %dir /lib/mkinitrd %dir /lib/mkinitrd/scripts +/lib/udev/rules.d/64-lvm2.rules +/lib/udev/collect_lvm /lib/mkinitrd/scripts/setup-lvm2.sh /lib/mkinitrd/scripts/boot-lvm2.sh /var/adm/fillup-templates/sysconfig.lvm @@ -194,10 +201,12 @@ /sbin/vgs /sbin/vgscan /sbin/vgsplit +/%_lib/libdevmapper-event-lvm2mirror.so +/%_lib/libdevmapper-event-lvm2snapshot.so +/%_lib/liblvm2cmd.so /%_lib/libdevmapper-event-lvm2mirror.so.2.02 /%_lib/libdevmapper-event-lvm2snapshot.so.2.02 /%_lib/liblvm2cmd.so.2.02 -%{_mandir}/man8/clvmd.8.gz %{_mandir}/man5/lvm.conf.5.gz %{_mandir}/man8/lvchange.8.gz %{_mandir}/man8/lvcreate.8.gz @@ -243,6 +252,26 @@ %{_mandir}/man8/vgsplit.8.gz %changelog +* Wed Sep 10 2008 xwhu@novell.com +- Upgrade to 2.0.39 + Fix up cache for PVs without mdas after consistent VG metadata is processed. + Update validation of safe mirror log type conversions in lvconvert. + Fix lvconvert to disallow snapshot and mirror combinations. + Fix reporting of LV fields alongside unallocated PV segments. + Add --unquoted and --rows to reporting tools. + Avoid undefined return value after _memlock manipulation in lvm2_run. + Avoid link failure if configured without --enable-cmdlib or --enable-readline. + Make clvmd return at once if other nodes down in a gulm or openais cluster. + Fix and improve readahead 'auto' calculation for stripe_size. + Fix lvchange output for -r auto setting if auto is already set. + Fix ambiguous use of identifier error_message_produced. + Fix add_mirror_images not to dereference uninitialized log_lv upon failure. + Don't call openlog for every debug line output by clvmd. + Add --force to lvextend and lvresize. + Fix vgchange to not activate mirror leg and log volumes directly. + Fix test directory clean up in make distclean. +- pvcreate/pvremove/pvchange will create symlinks in /dev/disk/by-id/ + to the device file * Wed Sep 03 2008 hare@suse.de - Call mkinitrd_setup during %%post and %%postun (bnc#413709) * Tue Sep 02 2008 hare@suse.de @@ -256,6 +285,8 @@ - Remove the -p option for fillup_and_insserv * Wed Aug 13 2008 xwhu@suse.de - Add Should-Stop to boot.lvm +* Fri Aug 01 2008 xwhu@suse.de +- repack LVM2.2.02.38.tar.bz2 into bz2 format * Wed Jul 23 2008 hare@suse.de - Include mkinitrd scriptlets. * Fri Jun 27 2008 xwhu@suse.de ++++++ LVM2.2.02.38.tar.bz2 -> LVM2.2.02.39.tar.bz2 ++++++ ++++ 99689 lines of diff (skipped) ++++++ lvm.conf ++++++ --- lvm2/lvm.conf 2004-05-24 14:31:07.000000000 +0200 +++ lvm2/lvm.conf 2008-09-10 13:42:32.000000000 +0200 @@ -280,4 +280,23 @@ # dirs = [ "/etc/lvm/metadata", "/mnt/disk2/lvm/metadata2" ] #} +dmeventd { + # mirror_library is the library used when monitoring a mirror device. + # + # "libdevmapper-event-lvm2mirror.so" attempts to recover from + # failures. It removes failed devices from a volume group and + # reconfigures a mirror as necessary. If no mirror library is + # provided, mirrors are not monitored through dmeventd. + + mirror_library = "libdevmapper-event-lvm2mirror.so.2.02" + + # snapshot_library is the library used when monitoring a snapshot device. + # + # "libdevmapper-event-lvm2snapshot.so" monitors the filling of + # snapshots and emits a warning through syslog, when the use of + # snapshot exceedes 80%. The warning is repeated when 85%, 90% and + # 95% of the snapshot are filled. + + snapshot_library = "libdevmapper-event-lvm2snapshot.so.2.02" +} ++++++ lvm-pv-create-link.diff ++++++ Index: LVM2.2.02.39/tools/pvremove.c =================================================================== --- LVM2.2.02.39.orig/tools/pvremove.c 2007-11-22 02:25:06.000000000 +0100 +++ LVM2.2.02.39/tools/pvremove.c 2008-09-11 16:10:31.000000000 +0200 @@ -18,6 +18,32 @@ const char _really_wipe[] = "Really WIPE LABELS from physical volume \"%s\" of volume group \"%s\" [y/n]? "; +static const char* pv_remove_symlink(struct cmd_context* cmd, const char* name) +{ + struct physical_volume *pv; + char *pvuuid; + char pvuuid_link[70]; + + init_partial(1); + if (!(pv = pv_read(cmd, name, NULL, NULL, 1))) { + return NULL; + } + init_partial(0); + + pvuuid = malloc(sizeof(char)*40); + if (pvuuid == NULL) { + return NULL; + } + + id_write_format(&pv->id, pvuuid, 40); + + snprintf(pvuuid_link, 70, "/dev/disk/by-id/lvm2-pvuuid-%s", pvuuid); + unlink(pvuuid_link); //we really don't care if it successed or not. + + free(pvuuid); + return pvuuid; +} + /* * Decide whether it is "safe" to wipe the labels on this device. * 0 indicates we may not. @@ -108,6 +134,8 @@ log_print("Labels on physical volume \"%s\" successfully wiped", pv_name); + pv_remove_symlink(cmd, pv_name); + ret = ECMD_PROCESSED; error: Index: LVM2.2.02.39/tools/pvcreate.c =================================================================== --- LVM2.2.02.39.orig/tools/pvcreate.c 2008-06-24 22:10:32.000000000 +0200 +++ LVM2.2.02.39/tools/pvcreate.c 2008-09-11 16:11:04.000000000 +0200 @@ -23,6 +23,95 @@ const char _really_init[] = "Really INITIALIZE physical volume \"%s\" of volume group \"%s\" [y/n]? "; +static const char* pv_follow_if_link (const char* path) +{ + int r; + int len = 60; + char *fpath = NULL; + char *npath = NULL; + struct stat st; + + r = lstat(path, &st); + if (r == -1) return NULL; //shouldn't happen + + if (S_ISLNK(st.st_mode)) { + while (1) { + npath = realloc(fpath, sizeof(char)*len); + if (npath == NULL) { + if (fpath != NULL) free(fpath); + return NULL; + } + fpath = npath; + + memset(fpath, 0, sizeof(char)*len); + r = readlink(path, fpath, len); + if (r != -1 && fpath[len-1] == 0) break; + if (r == -1) { + free(fpath); + return NULL; + } else { + len = len * 2; + } + } + } + else { + fpath = strdup(path); + } + return fpath; +} + + +static const char* pv_symlink_handle(struct cmd_context* cmd, const char* name, int create) +{ + struct physical_volume *pv; + char *pvuuid; + char *pvuuid_link; + int old_partial; + + pvuuid_link = malloc(70); + if (pvuuid_link == NULL) return NULL; + + old_partial = partial_mode(); + + init_partial(1); + if (!(pv = pv_read(cmd, name, NULL, NULL, 1))) { + free(pvuuid_link); + init_partial(old_partial); + return NULL; + } + init_partial(old_partial); + + pvuuid = malloc(sizeof(char)*40); + if (pvuuid == NULL) { + free(pvuuid_link); + return NULL; + } + + id_write_format(&pv->id, pvuuid, 40); + + snprintf(pvuuid_link, 70, "/dev/disk/by-id/lvm2-pvuuid-%s", pvuuid); + + //we really don't care if it successed or not. + if (create) { + const char* tname = NULL; + int r; + tname = pv_follow_if_link(name); + if (tname != NULL) { + r = symlink(tname, pvuuid_link); + free(tname); + } + else { + symlink(name, pvuuid_link); + } + } else { + //pvuuid_link is saved for future unlink + //unlink(pvuuid_link); + } + + free(pvuuid); + return pvuuid_link; +} + /* * See if we may pvcreate on this device. * 0 indicates we may not. @@ -42,6 +131,7 @@ /* Is there a pv here already? */ /* FIXME Use partial mode here? */ + init_partial(1); pv = pv_read(cmd, name, NULL, NULL, 0); /* @@ -55,6 +145,7 @@ return_0; pv = pv_read(cmd, name, NULL, NULL, 0); } + init_partial(0); /* Allow partial & exported VGs to be destroyed. */ /* We must have -ff to overwrite a non orphan */ @@ -151,6 +242,7 @@ const char *restorefile; uint64_t pe_start = 0; uint32_t extent_count = 0, extent_size = 0; + const char *oldsymlink; if (arg_count(cmd, uuidstr_ARG)) { uuid = arg_str_value(cmd, uuidstr_ARG, ""); @@ -258,13 +350,23 @@ log_very_verbose("Writing physical volume data to disk \"%s\"", pv_name); + + oldsymlink = pv_symlink_handle(cmd, pv_name, 0); + if (!(pv_write(cmd, (struct physical_volume *)pv, &mdas, arg_int64_value(cmd, labelsector_ARG, DEFAULT_LABELSECTOR)))) { log_error("Failed to write physical volume \"%s\"", pv_name); + if (oldsymlink) free(oldsymlink); goto error; } + pv_symlink_handle(cmd, pv_name, 1); + if (oldsymlink) { + unlink(oldsymlink); + free(oldsymlink); + } + log_print("Physical volume \"%s\" successfully created", pv_name); unlock_vg(cmd, VG_ORPHANS); Index: LVM2.2.02.39/tools/pvchange.c =================================================================== --- LVM2.2.02.39.orig/tools/pvchange.c 2008-02-06 16:47:28.000000000 +0100 +++ LVM2.2.02.39/tools/pvchange.c 2008-09-11 16:11:27.000000000 +0200 @@ -15,6 +15,95 @@ #include "tools.h" +static const char* pv_follow_if_link (const char* path) +{ + int r; + int len = 60; + char *fpath = NULL; + char *npath = NULL; + struct stat st; + + r = lstat(path, &st); + if (r == -1) return NULL; //shouldn't happen + + if (S_ISLNK(st.st_mode)) { + while (1) { + npath = realloc(fpath, sizeof(char)*len); + if (npath == NULL) { + if (fpath != NULL) free(fpath); + return NULL; + } + fpath = npath; + + memset(fpath, 0, sizeof(char)*len); + r = readlink(path, fpath, len); + if (r != -1 && fpath[len-1] == 0) break; + if (r == -1) { + free(fpath); + return NULL; + } else { + len = len * 2; + } + } + } + else { + fpath = strdup(path); + } + return fpath; +} + +static const char* pv_symlink_handle(struct cmd_context* cmd, const char* name, int create) +{ + struct physical_volume *pv; + char *pvuuid; + char *pvuuid_link; + int old_partial; + + pvuuid_link = malloc(70); + if (pvuuid_link == NULL) return NULL; + + old_partial = partial_mode(); + + init_partial(1); + if (!(pv = pv_read(cmd, name, NULL, NULL, 1))) { + free(pvuuid_link); + init_partial(old_partial); + return NULL; + } + init_partial(old_partial); + + pvuuid = malloc(sizeof(char)*40); + if (pvuuid == NULL) { + free(pvuuid_link); + return NULL; + } + + id_write_format(&pv->id, pvuuid, 40); + + snprintf(pvuuid_link, 70, "/dev/disk/by-id/lvm2-pvuuid-%s", pvuuid); + + //we really don't care if it successed or not. + if (create) { + const char* tname = NULL; + int r; + tname = pv_follow_if_link(name); + if (tname != NULL) { + r = symlink(tname, pvuuid_link); + free(tname); + } + else { + symlink(name, pvuuid_link); + } + } else { + //pvuuid_link is saved for future unlink + //unlink(pvuuid_link); + } + + free(pvuuid); + return pvuuid_link; +} + + /* FIXME Locking. PVs in VG. */ static int _pvchange_single(struct cmd_context *cmd, struct physical_volume *pv, @@ -169,16 +258,28 @@ } log_verbose("Changing uuid of %s to %s.", pv_name, uuid); if (!is_orphan(pv)) { + const char* oldsymlink; + orig_vg_name = pv_vg_name(pv); orig_pe_alloc_count = pv_pe_alloc_count(pv); pv->vg_name = pv->fmt->orphan_vg_name; pv->pe_alloc_count = 0; + oldsymlink = pv_symlink_handle(cmd, pv_name, 0); + if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) { log_error("pv_write with new uuid failed " "for %s.", pv_name); + if (oldsymlink) free(oldsymlink); unlock_vg(cmd, vg_name); return 0; } + + pv_symlink_handle(cmd, pv_name, 1); + if (oldsymlink) { + unlink(oldsymlink); + free(oldsymlink); + } + pv->vg_name = orig_vg_name; pv->pe_alloc_count = orig_pe_alloc_count; } @@ -193,11 +294,23 @@ return 0; } backup(vg); - } else if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) { - unlock_vg(cmd, vg_name); - log_error("Failed to store physical volume \"%s\"", - pv_name); - return 0; + } else { + const char* oldsymlink; + oldsymlink = pv_symlink_handle(cmd, pv_name, 0); + + if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) { + unlock_vg(cmd, vg_name); + log_error("Failed to store physical volume \"%s\"", + pv_name); + if (oldsymlink) free(oldsymlink); + return 0; + } + pv_symlink_handle(cmd, pv_name, 1); + if (oldsymlink) { + unlink(oldsymlink); + free(oldsymlink); + } + } unlock_vg(cmd, vg_name); ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org