diff options
Diffstat (limited to 'testing/multipath-tools/multipath-tools-0.4.8-r1-kpartx.patch')
-rw-r--r-- | testing/multipath-tools/multipath-tools-0.4.8-r1-kpartx.patch | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/testing/multipath-tools/multipath-tools-0.4.8-r1-kpartx.patch b/testing/multipath-tools/multipath-tools-0.4.8-r1-kpartx.patch new file mode 100644 index 0000000000..ae2a7fe1c6 --- /dev/null +++ b/testing/multipath-tools/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; |