X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=util.c;h=1736d70791c8ce5d145f6c01516384f4c19adb30;hp=ab2d7e9f06e3cb1f91a4a9c30529df872ee95670;hb=9008ed1c9623b7c11775ea8a7be17eb1bde5fd09;hpb=2eb91c81d8da5cfdc36c93d8daf405c95e8bac2f diff --git a/util.c b/util.c index ab2d7e9f..1736d707 100644 --- a/util.c +++ b/util.c @@ -828,6 +828,20 @@ int open_dev_excl(int devnum) return -1; } +int same_dev(char *one, char *two) +{ + struct stat st1, st2; + if (stat(one, &st1) != 0) + return 0; + if (stat(two, &st2) != 0) + return 0; + if ((st1.st_mode & S_IFMT) != S_IFBLK) + return 0; + if ((st2.st_mode & S_IFMT) != S_IFBLK) + return 0; + return st1.st_rdev == st2.st_rdev; +} + struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL }; #if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) @@ -1116,13 +1130,34 @@ int devname2devnum(char *name) int stat2devnum(struct stat *st) { + char path[30]; + char link[200]; + char *cp; + int n; + if ((S_IFMT & st->st_mode) == S_IFBLK) { if (major(st->st_rdev) == MD_MAJOR) return minor(st->st_rdev); - else - return -1- (minor(st->st_rdev)>>6); + else if (major(st->st_rdev) == get_mdp_major()) + return -1- (minor(st->st_rdev)>>MdpMinorShift); + + /* must be an extended-minor partition. Look at the + * /sys/dev/block/%d:%d link which must look like + * ../../block/mdXXX/mdXXXpYY + */ + sprintf(path, "/sys/dev/block/%d:%d", major(st->st_rdev), + minor(st->st_rdev)); + n = readlink(path, link, sizeof(link)-1); + if (n <= 0) + return NoMdDev; + link[n] = 0; + cp = strrchr(link, '/'); + if (cp) *cp = 0; + cp = strchr(link, '/'); + if (cp && strncmp(cp, "/md", 3) == 0) + return devname2devnum(cp+1); } - return -1; + return NoMdDev; } @@ -1131,7 +1166,7 @@ int fd2devnum(int fd) struct stat stb; if (fstat(fd, &stb) == 0) return stat2devnum(&stb); - return -1; + return NoMdDev; } int mdmon_running(int devnum) @@ -1188,7 +1223,7 @@ int start_mdmon(int devnum) NULL }; - if (env_no_mdmon()) + if (check_env("MDADM_NO_MDMON")) return 0; len = readlink("/proc/self/exe", pathbuf, sizeof(pathbuf)); @@ -1227,9 +1262,9 @@ int start_mdmon(int devnum) return 0; } -int env_no_mdmon(void) +int check_env(char *name) { - char *val = getenv("MDADM_NO_MDMON"); + char *val = getenv(name); if (val && atoi(val) == 1) return 1; @@ -1278,15 +1313,6 @@ void append_metadata_update(struct supertype *st, void *buf, int len) *st->update_tail = mu; st->update_tail = &mu->next; } - -struct superswitch *find_metadata_methods(char *vers) -{ - if (strcmp(vers, "ddf") == 0) - return &super_ddf; - if (strcmp(vers, "imsm") == 0) - return &super_imsm; - return NULL; -} #endif /* MDASSEMBLE */ #ifdef __TINYC__