92 lines
2.4 KiB
Diff
92 lines
2.4 KiB
Diff
|
Index: multipath-tools/multipath/main.c
|
||
|
===================================================================
|
||
|
--- multipath-tools.orig/multipath/main.c
|
||
|
+++ multipath-tools/multipath/main.c
|
||
|
@@ -22,6 +22,8 @@
|
||
|
* Copyright (c) 2005 Edward Goggin, EMC
|
||
|
*/
|
||
|
|
||
|
+#include <sys/types.h>
|
||
|
+#include <sys/stat.h>
|
||
|
#include <stdio.h>
|
||
|
#include <unistd.h>
|
||
|
#include <ctype.h>
|
||
|
@@ -52,6 +54,7 @@
|
||
|
#include <sys/time.h>
|
||
|
#include <sys/resource.h>
|
||
|
#include <finder.h>
|
||
|
+#include "dev_t.h"
|
||
|
|
||
|
int logsink;
|
||
|
|
||
|
@@ -333,13 +336,29 @@ out:
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
+static int
|
||
|
+get_dev_type(char *dev) {
|
||
|
+ struct stat buf;
|
||
|
+ int i;
|
||
|
+
|
||
|
+ if (stat(dev, &buf) == 0 && S_ISBLK(buf.st_mode)) {
|
||
|
+ if (dm_is_dm_major(MAJOR(buf.st_rdev)))
|
||
|
+ return DEV_DEVMAP;
|
||
|
+ return DEV_DEVNODE;
|
||
|
+ }
|
||
|
+ else if (sscanf(dev, "%d:%d", &i, &i) == 2)
|
||
|
+ return DEV_DEVT;
|
||
|
+ else
|
||
|
+ return DEV_DEVMAP;
|
||
|
+}
|
||
|
+
|
||
|
int
|
||
|
main (int argc, char *argv[])
|
||
|
{
|
||
|
int arg;
|
||
|
extern char *optarg;
|
||
|
extern int optind;
|
||
|
- int i, r = 1;
|
||
|
+ int r = 1;
|
||
|
|
||
|
if (getuid() != 0) {
|
||
|
fprintf(stderr, "need to be root\n");
|
||
|
@@ -436,14 +455,7 @@ main (int argc, char *argv[])
|
||
|
goto out;
|
||
|
|
||
|
strncpy(conf->dev, argv[optind], FILE_NAME_SIZE);
|
||
|
-
|
||
|
- if (filepresent(conf->dev))
|
||
|
- conf->dev_type = DEV_DEVNODE;
|
||
|
- else if (sscanf(conf->dev, "%d:%d", &i, &i) == 2)
|
||
|
- conf->dev_type = DEV_DEVT;
|
||
|
- else
|
||
|
- conf->dev_type = DEV_DEVMAP;
|
||
|
-
|
||
|
+ conf->dev_type = get_dev_type(conf->dev);
|
||
|
}
|
||
|
conf->daemon = 0;
|
||
|
|
||
|
Index: multipath-tools/multipath/dev_t.h
|
||
|
===================================================================
|
||
|
--- multipath-tools.orig/multipath/dev_t.h
|
||
|
+++ multipath-tools/multipath/dev_t.h
|
||
|
@@ -1,15 +1,3 @@
|
||
|
-#define MINORBITS 20
|
||
|
-#define MINORMASK ((1U << MINORBITS) - 1)
|
||
|
-
|
||
|
-#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
|
||
|
-#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
|
||
|
-#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
|
||
|
-
|
||
|
-#define print_dev_t(buffer, dev) \
|
||
|
- sprintf((buffer), "%u:%u\n", MAJOR(dev), MINOR(dev))
|
||
|
-
|
||
|
-#define format_dev_t(buffer, dev) \
|
||
|
- ({ \
|
||
|
- sprintf(buffer, "%u:%u", MAJOR(dev), MINOR(dev)); \
|
||
|
- buffer; \
|
||
|
- })
|
||
|
+#define MAJOR(dev) ((dev & 0xfff00) >> 8)
|
||
|
+#define MINOR(dev) ((dev & 0xff) | ((dev >> 12) & 0xfff00))
|
||
|
+#define MKDEV(ma,mi) ((mi & 0xff) | (ma << 8) | ((mi & ~0xff) << 12))
|