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 +#include #include #include #include @@ -52,6 +54,7 @@ #include #include #include +#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))