summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2009-10-30 06:50:12 +0000
committerRobin H. Johnson <robbat2@gentoo.org>2009-10-30 06:50:12 +0000
commit9a56e69ed99511db90c557ba28bc41123c0ba221 (patch)
treeb69fafa93fa4b918ffdc59b85290827b6ef34931
parentImport a bunch of alpha patches #289642 by Matt Turner. (diff)
downloadgentoo-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)
-rw-r--r--sys-fs/multipath-tools/ChangeLog12
-rw-r--r--sys-fs/multipath-tools/files/init.d-multipath-0.4.8-r141
-rw-r--r--sys-fs/multipath-tools/files/multipath-tools-0.4.8-r1-kpartx.patch250
-rw-r--r--sys-fs/multipath-tools/files/multipath-tools-0.4.8-udev-scsi_id-changes.patch90
-rw-r--r--sys-fs/multipath-tools/multipath-tools-0.4.8-r1.ebuild79
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, &sectors);
+- 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!"
+}