diff options
author | Robin H. Johnson <robbat2@gentoo.org> | 2009-10-30 06:50:12 +0000 |
---|---|---|
committer | Robin H. Johnson <robbat2@gentoo.org> | 2009-10-30 06:50:12 +0000 |
commit | 9a56e69ed99511db90c557ba28bc41123c0ba221 (patch) | |
tree | b69fafa93fa4b918ffdc59b85290827b6ef34931 | |
parent | Import a bunch of alpha patches #289642 by Matt Turner. (diff) | |
download | gentoo-2-9a56e69ed99511db90c557ba28bc41123c0ba221.tar.gz gentoo-2-9a56e69ed99511db90c557ba28bc41123c0ba221.tar.bz2 gentoo-2-9a56e69ed99511db90c557ba28bc41123c0ba221.zip |
Upstream is a slacker and has not made a release in 2+ years despite being active in Git. Fixes bug #235836: udev scsi_id lost the -s option a long time ago. Bug #245615: remove the 1TiB limit on kpartx.
(Portage version: 2.2_rc46/cvs/Linux x86_64)
5 files changed, 471 insertions, 1 deletions
diff --git a/sys-fs/multipath-tools/ChangeLog b/sys-fs/multipath-tools/ChangeLog index 88a2041ee5c4..315e1c7aca0c 100644 --- a/sys-fs/multipath-tools/ChangeLog +++ b/sys-fs/multipath-tools/ChangeLog @@ -1,6 +1,16 @@ # ChangeLog for sys-fs/multipath-tools # Copyright 1999-2009 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/sys-fs/multipath-tools/ChangeLog,v 1.26 2009/09/19 04:47:49 robbat2 Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-fs/multipath-tools/ChangeLog,v 1.27 2009/10/30 06:50:12 robbat2 Exp $ + +*multipath-tools-0.4.8-r1 (30 Oct 2009) + + 30 Oct 2009; Robin H. Johnson <robbat2@gentoo.org> + +files/init.d-multipath-0.4.8-r1, +multipath-tools-0.4.8-r1.ebuild, + +files/multipath-tools-0.4.8-r1-kpartx.patch, + +files/multipath-tools-0.4.8-udev-scsi_id-changes.patch: + Upstream is a slacker and has not made a release in 2+ years despite being + active in Git. Fixes bug #235836: udev scsi_id lost the -s option a long + time ago. Bug #245615: remove the 1TiB limit on kpartx. 19 Sep 2009; Robin H. Johnson <robbat2@gentoo.org> multipath-tools-0.4.8.ebuild: diff --git a/sys-fs/multipath-tools/files/init.d-multipath-0.4.8-r1 b/sys-fs/multipath-tools/files/init.d-multipath-0.4.8-r1 new file mode 100644 index 000000000000..3ec8d1cc285c --- /dev/null +++ b/sys-fs/multipath-tools/files/init.d-multipath-0.4.8-r1 @@ -0,0 +1,41 @@ +#!/sbin/runscript +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-fs/multipath-tools/files/init.d-multipath-0.4.8-r1,v 1.1 2009/10/30 06:50:11 robbat2 Exp $ + +# Existence of this file means we are on baselayout 2. +check_bl2_file='/etc/init.d/sysfs' + +depend() { + if [ -e ${check_bl2_file} ]; then + # on baselayout-1 this causes + # dependency-cycles with checkroot (before *) + before checkfs fsck multipathd lvm + after modules device-mapper + fi +} + +# Once we are ready to stop baselayout1 support, we can just merge the addons +# into here. +run_addon() { + local f=/lib/rcscripts/addons/$1.sh + if [ -r "$f" ]; then + ( . "$f" ) + fi +} + +start() { + if [ ! -e ${check_bl2_file} ]; then + eerror "The $SVCNAME init-script is written for baselayout-2!" + eerror "Please do not use it with baselayout-1!". + return 1 + fi + + run_addon multipath-start +} + +stop() { + run_addon multipath-stop +} + +# vim:ts=4 diff --git a/sys-fs/multipath-tools/files/multipath-tools-0.4.8-r1-kpartx.patch b/sys-fs/multipath-tools/files/multipath-tools-0.4.8-r1-kpartx.patch new file mode 100644 index 000000000000..ae2a7fe1c6e9 --- /dev/null +++ b/sys-fs/multipath-tools/files/multipath-tools-0.4.8-r1-kpartx.patch @@ -0,0 +1,250 @@ +diff --git a/kpartx/devmapper.c b/kpartx/devmapper.c +index 3e973aa..893d6dd 100644 +--- a/kpartx/devmapper.c ++++ b/kpartx/devmapper.c +@@ -4,10 +4,12 @@ + #include <stdio.h> + #include <stdlib.h> + #include <string.h> ++#include <stdint.h> + #include <libdevmapper.h> + #include <ctype.h> + #include <linux/kdev_t.h> + #include <errno.h> ++#include "devmapper.h" + + #define UUID_PREFIX "part%d-" + #define MAX_PREFIX_LEN 8 +@@ -72,7 +74,7 @@ dm_simplecmd (int task, const char *name) { + + extern int + dm_addmap (int task, const char *name, const char *target, +- const char *params, unsigned long size, const char *uuid, int part) { ++ const char *params, uint64_t size, const char *uuid, int part) { + int r = 0; + struct dm_task *dmt; + char *prefixed_uuid = NULL; +diff --git a/kpartx/devmapper.h b/kpartx/devmapper.h +index ccdbead..2bd27d2 100644 +--- a/kpartx/devmapper.h ++++ b/kpartx/devmapper.h +@@ -1,7 +1,7 @@ + int dm_prereq (char *, int, int, int); + int dm_simplecmd (int, const char *); +-int dm_addmap (int, const char *, const char *, const char *, unsigned long, +- char *, int); ++int dm_addmap (int, const char *, const char *, const char *, uint64_t, ++ const char *, int); + int dm_map_present (char *); + char * dm_mapname(int major, int minor); + dev_t dm_get_first_dep(char *devname); +diff --git a/kpartx/gpt.c b/kpartx/gpt.c +index dc846ca..047a829 100644 +--- a/kpartx/gpt.c ++++ b/kpartx/gpt.c +@@ -36,6 +36,7 @@ + #include <errno.h> + #include <endian.h> + #include <byteswap.h> ++#include <linux/fs.h> + #include "crc32.h" + + #if BYTE_ORDER == LITTLE_ENDIAN +@@ -50,10 +51,18 @@ + # define __cpu_to_le32(x) bswap_32(x) + #endif + ++#ifndef BLKGETLASTSECT + #define BLKGETLASTSECT _IO(0x12,108) /* get last sector of block device */ ++#endif ++#ifndef BLKGETSIZE + #define BLKGETSIZE _IO(0x12,96) /* return device size */ ++#endif ++#ifndef BLKSSZGET + #define BLKSSZGET _IO(0x12,104) /* get block device sector size */ ++#endif ++#ifndef BLKGETSIZE64 + #define BLKGETSIZE64 _IOR(0x12,114,sizeof(uint64_t)) /* return device size in bytes (u64 *arg) */ ++#endif + + struct blkdev_ioctl_param { + unsigned int block; +@@ -143,20 +152,14 @@ get_sector_size(int filedes) + static uint64_t + _get_num_sectors(int filedes) + { +- unsigned long sectors=0; + int rc; +-#if 0 +- uint64_t bytes=0; ++ uint64_t bytes=0; + +- rc = ioctl(filedes, BLKGETSIZE64, &bytes); ++ rc = ioctl(filedes, BLKGETSIZE64, &bytes); + if (!rc) + return bytes / get_sector_size(filedes); +-#endif +- rc = ioctl(filedes, BLKGETSIZE, §ors); +- if (rc) +- return 0; +- +- return sectors; ++ ++ return 0; + } + + /************************************************************ +@@ -193,7 +196,7 @@ last_lba(int filedes) + sectors = 1; + } + +- return sectors - 1; ++ return sectors ? sectors - 1 : 0; + } + + +@@ -220,17 +223,22 @@ read_lba(int fd, uint64_t lba, void *buffer, size_t bytes) + { + int sector_size = get_sector_size(fd); + off_t offset = lba * sector_size; ++ uint64_t lastlba; + ssize_t bytesread; + + lseek(fd, offset, SEEK_SET); + bytesread = read(fd, buffer, bytes); + ++ lastlba = last_lba(fd); ++ if (!lastlba) ++ return bytesread; ++ + /* Kludge. This is necessary to read/write the last + block of an odd-sized disk, until Linux 2.5.x kernel fixes. + This is only used by gpt.c, and only to read + one sector, so we don't have to be fancy. + */ +- if (!bytesread && !(last_lba(fd) & 1) && lba == last_lba(fd)) { ++ if (!bytesread && !(lastlba & 1) && lba == lastlba) { + bytesread = read_lastoddsector(fd, lba, buffer, bytes); + } + return bytesread; +@@ -505,7 +513,8 @@ find_valid_gpt(int fd, gpt_header ** gpt, gpt_entry ** ptes) + if (!gpt || !ptes) + return 0; + +- lastlba = last_lba(fd); ++ if (!(lastlba = last_lba(fd))) ++ return 0; + good_pgpt = is_gpt_valid(fd, GPT_PRIMARY_PARTITION_TABLE_LBA, + &pgpt, &pptes); + if (good_pgpt) { +diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c +index dbe2ee2..72ca81d 100644 +--- a/kpartx/kpartx.c ++++ b/kpartx/kpartx.c +@@ -25,6 +25,7 @@ + #include <stdlib.h> + #include <string.h> + #include <unistd.h> ++#include <stdint.h> + #include <sys/stat.h> + #include <sys/types.h> + #include <ctype.h> +@@ -366,16 +367,16 @@ main(int argc, char **argv){ + + slices[j].minor = m++; + +- printf("%s%s%d : 0 %lu %s %lu\n", ++ printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n", + mapname, delim, j+1, +- (unsigned long) slices[j].size, device, +- (unsigned long) slices[j].start); ++ slices[j].size, device, ++ slices[j].start); + } + /* Loop to resolve contained slices */ + d = c; + while (c) { + for (j = 0; j < n; j++) { +- unsigned long start; ++ uint64_t start; + int k = slices[j].container - 1; + + if (slices[j].size == 0) +@@ -387,9 +388,9 @@ main(int argc, char **argv){ + slices[j].minor = m++; + + start = slices[j].start - slices[k].start; +- printf("%s%s%d : 0 %lu /dev/dm-%d %lu\n", ++ printf("%s%s%d : 0 %" PRIu64 " /dev/dm-%d %" PRIu64 "\n", + mapname, delim, j+1, +- (unsigned long) slices[j].size, ++ slices[j].size, + slices[k].minor, start); + c--; + } +@@ -448,8 +449,8 @@ main(int argc, char **argv){ + } + strip_slash(partname); + +- if (safe_sprintf(params, "%s %lu", device, +- (unsigned long)slices[j].start)) { ++ if (safe_sprintf(params, "%s %" PRIu64 , ++ device, slices[j].start)) { + fprintf(stderr, "params too small\n"); + exit(1); + } +@@ -468,7 +469,7 @@ main(int argc, char **argv){ + &slices[j].minor); + + if (verbose) +- printf("add map %s (%d:%d): 0 %lu %s %s\n", ++ printf("add map %s (%d:%d): 0 %" PRIu64 " %s %s\n", + partname, slices[j].major, + slices[j].minor, slices[j].size, + DM_TARGET, params); +@@ -502,10 +503,10 @@ main(int argc, char **argv){ + } + strip_slash(partname); + +- if (safe_sprintf(params, "%d:%d %lu", ++ if (safe_sprintf(params, "%d:%d %" PRIu64, + slices[k].major, + slices[k].minor, +- (unsigned long)slices[j].start)) { ++ slices[j].start)) { + fprintf(stderr, "params too small\n"); + exit(1); + } +@@ -524,7 +525,7 @@ main(int argc, char **argv){ + &slices[j].minor); + + if (verbose) +- printf("add map %s : 0 %lu %s %s\n", ++ printf("add map %s : 0 %" PRIu64 " %s %s\n", + partname, slices[j].size, + DM_TARGET, params); + c--; +diff --git a/kpartx/kpartx.h b/kpartx/kpartx.h +index 9b3aeca..43ae3f8 100644 +--- a/kpartx/kpartx.h ++++ b/kpartx/kpartx.h +@@ -1,6 +1,8 @@ + #ifndef _KPARTX_H + #define _KPARTX_H + ++#include <stdint.h> ++ + /* + * For each partition type there is a routine that takes + * a block device and a range, and returns the list of +@@ -20,8 +22,8 @@ + * units: 512 byte sectors + */ + struct slice { +- unsigned long start; +- unsigned long size; ++ uint64_t start; ++ uint64_t size; + int container; + int major; + int minor; diff --git a/sys-fs/multipath-tools/files/multipath-tools-0.4.8-udev-scsi_id-changes.patch b/sys-fs/multipath-tools/files/multipath-tools-0.4.8-udev-scsi_id-changes.patch new file mode 100644 index 000000000000..a770a05899a1 --- /dev/null +++ b/sys-fs/multipath-tools/files/multipath-tools-0.4.8-udev-scsi_id-changes.patch @@ -0,0 +1,90 @@ +diff -Nuar multipath-tools-0.4.8.orig/libmultipath/defaults.h multipath-tools-0.4.8/libmultipath/defaults.h +--- multipath-tools-0.4.8.orig/libmultipath/defaults.h 2007-08-02 21:05:37.000000000 +0000 ++++ multipath-tools-0.4.8/libmultipath/defaults.h 2009-10-30 06:00:21.432553430 +0000 +@@ -1,4 +1,4 @@ +-#define DEFAULT_GETUID "/lib/udev/scsi_id -g -u -s /block/%n" ++#define DEFAULT_GETUID "/lib/udev/scsi_id -g -u -d /dev/%n" + #define DEFAULT_UDEVDIR "/dev" + #define DEFAULT_SELECTOR "round-robin 0" + #define DEFAULT_FEATURES "0" +diff -Nuar multipath-tools-0.4.8.orig/libmultipath/hwtable.c multipath-tools-0.4.8/libmultipath/hwtable.c +--- multipath-tools-0.4.8.orig/libmultipath/hwtable.c 2007-08-02 21:05:37.000000000 +0000 ++++ multipath-tools-0.4.8/libmultipath/hwtable.c 2009-10-30 06:00:08.087158020 +0000 +@@ -157,7 +157,7 @@ + /* HP Smart Array */ + .vendor = "HP", + .product = "LOGICAL VOLUME.*", +- .getuid = "/lib/udev/scsi_id -n -g -u -s /block/%n", ++ .getuid = "/lib/udev/scsi_id -n -g -u -d /dev/%n", + .getprio = NULL, + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +@@ -199,7 +199,7 @@ + { + .vendor = "EMC", + .product = "SYMMETRIX", +- .getuid = "/lib/udev/scsi_id -g -u -ppre-spc3-83 -s /block/%n", ++ .getuid = "/lib/udev/scsi_id -g -u -ppre-spc3-83 -d /dev/%n", + .getprio = NULL, + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +diff -Nuar multipath-tools-0.4.8.orig/multipath/multipath.conf.5 multipath-tools-0.4.8/multipath/multipath.conf.5 +--- multipath-tools-0.4.8.orig/multipath/multipath.conf.5 2007-08-02 21:05:37.000000000 +0000 ++++ multipath-tools-0.4.8/multipath/multipath.conf.5 2009-10-30 05:59:19.272559733 +0000 +@@ -109,7 +109,7 @@ + The default program and args to callout to obtain a unique path + identifier. Should be specified with an absolute path. Default value + is +-.I /lib/udev/scsi_id -g -u -s ++.I /lib/udev/scsi_id -g -u -d + .TP + .B prio_callout + The default program and args to callout to obtain a path priority +diff -Nuar multipath-tools-0.4.8.orig/multipath.conf.annotated multipath-tools-0.4.8/multipath.conf.annotated +--- multipath-tools-0.4.8.orig/multipath.conf.annotated 2007-08-02 21:05:37.000000000 +0000 ++++ multipath-tools-0.4.8/multipath.conf.annotated 2009-10-30 05:59:53.002576683 +0000 +@@ -47,9 +47,9 @@ + # # scope : multipath + # # desc : the default program and args to callout to obtain a unique + # # path identifier. Absolute path required +-# # default : /lib/udev/scsi_id -g -u -s ++# # default : /lib/udev/scsi_id -g -u -d + # # +-# getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n" ++# getuid_callout "/lib/udev/scsi_id -g -u -d /dev/%n" + # + # # + # # name : prio_callout +@@ -291,9 +291,9 @@ + # # scope : multipath + # # desc : the program and args to callout to obtain a unique + # # path identifier. Absolute path required +-# # default : /lib/udev/scsi_id -g -u -s ++# # default : /lib/udev/scsi_id -g -u -d + # # +-# getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n" ++# getuid_callout "/lib/udev/scsi_id -g -u -d /dev/%n" + # + # # + # # name : prio_callout +diff -Nuar multipath-tools-0.4.8.orig/multipath.conf.synthetic multipath-tools-0.4.8/multipath.conf.synthetic +--- multipath-tools-0.4.8.orig/multipath.conf.synthetic 2007-08-02 21:05:37.000000000 +0000 ++++ multipath-tools-0.4.8/multipath.conf.synthetic 2009-10-30 05:59:38.569224508 +0000 +@@ -7,7 +7,7 @@ + # polling_interval 10 + # selector "round-robin 0" + # path_grouping_policy multibus +-# getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n" ++# getuid_callout "/lib/udev/scsi_id -g -u -d /dev/%n" + # prio_callout /bin/true + # path_checker directio + # rr_min_io 100 +@@ -52,7 +52,7 @@ + # vendor "COMPAQ " + # product "HSV110 (C)COMPAQ" + # path_grouping_policy multibus +-# getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n" ++# getuid_callout "/lib/udev/scsi_id -g -u -d /dev/%n" + # path_checker directio + # path_selector "round-robin 0" + # hardware_handler "0" diff --git a/sys-fs/multipath-tools/multipath-tools-0.4.8-r1.ebuild b/sys-fs/multipath-tools/multipath-tools-0.4.8-r1.ebuild new file mode 100644 index 000000000000..24126b09f986 --- /dev/null +++ b/sys-fs/multipath-tools/multipath-tools-0.4.8-r1.ebuild @@ -0,0 +1,79 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-fs/multipath-tools/multipath-tools-0.4.8-r1.ebuild,v 1.1 2009/10/30 06:50:12 robbat2 Exp $ + +EAPI=2 +inherit eutils toolchain-funcs + +DESCRIPTION="Device mapper target autoconfig" +HOMEPAGE="http://christophe.varoqui.free.fr/" +SRC_URI="http://christophe.varoqui.free.fr/${PN}/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~amd64 ~arm ~ppc ~ppc64 ~x86" +IUSE="" + +RDEPEND="|| ( + >=sys-fs/lvm2-2.02.45 + >=sys-fs/device-mapper-1.00.19-r1 + ) + >=sys-fs/udev-124 + sys-fs/sysfsutils + dev-libs/libaio" +DEPEND="${RDEPEND}" + +src_prepare() { + epatch "${FILESDIR}"/${PN}-0.4.8-build.patch + epatch "${FILESDIR}"/${PN}-0.4.8-udev-scsi_id-changes.patch + # Patch per upstream tree for 1GiB limit of kpartx + epatch "${FILESDIR}"/${PN}-0.4.8-r1-kpartx.patch +} + +src_compile() { + # The -j1 is NOT a joke. The 0.4.8-era upstream code rebuilds several object + # files with different compiler defines. The upstream git, as yet unreleased + # moves to proper automake, but it's a large jump and is not being + # backported to 0.4.8. + emake -j1 CC="$(tc-getCC)" || die "emake failed" +} + +src_install() { + dodir /sbin /usr/share/man/man8 + make DESTDIR="${D}" install || die "install failed" + + insinto /etc + newins "${S}"/multipath.conf.annotated multipath.conf + fperms 644 /etc/udev/rules.d/65-multipath.rules + fperms 644 /etc/udev/rules.d/66-kpartx.rules + # This is the monitoring daemon + newinitd "${FILESDIR}"/rc-multipathd multipathd + # This is the init script that fires the multipath addon for baselayout2 + newinitd "${FILESDIR}"/init.d-multipath-0.4.8-r1 multipath + # Handle early-boot startup as well as shutdown of multipath devices + insinto /lib/rcscripts/addons + doins "${FILESDIR}"/multipath-start.sh + doins "${FILESDIR}"/multipath-stop.sh + + dodoc multipath.conf.* + dodoc AUTHOR ChangeLog FAQ README TODO + docinto kpartx; dodoc kpartx/ChangeLog kpartx/README +} + +pkg_preinst() { + # The dev.d script was previously wrong and is now removed (the udev rules + # file does the job instead), but it won't be removed from live systems due + # to cfgprotect. + # This should help out a little... + if [[ -e ${ROOT}/etc/dev.d/block/multipath.dev ]] ; then + mkdir -p "${D}"/etc/dev.d/block + echo "# Please delete this file. It is obsoleted by /etc/udev/rules.d/65-multipath.rules" \ + > "${D}"/etc/dev.d/block/multipath.dev + fi +} +pkg_postinst() { + elog "If you need multipath on your system, you should ensure that a" + elog "'multipath' entry is present in your RC_VOLUME_ORDER variable!" + elog "If you use baselayout2, you must add 'multipath' into" + elog "your boot runlevel!" +} |