X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=util.c;h=8845a0fb09bc452d6851c15d346c00eee4a8e5dd;hb=4408ee768bab1282b23d97c3d3e073292f79e982;hp=ab2d7e9f06e3cb1f91a4a9c30529df872ee95670;hpb=750b6fe656e31a3717b52cdaca6a3a90346bcbb8;p=thirdparty%2Fmdadm.git diff --git a/util.c b/util.c index ab2d7e9f..8845a0fb 100644 --- a/util.c +++ b/util.c @@ -828,6 +828,32 @@ 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; +} + +void wait_for(char *dev) +{ + int i; + + for (i=0 ; i<25 ; i++) { + struct stat stb; + if (stat(dev, &stb) == 0) + return; + usleep(200000); + } +} + struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL }; #if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) @@ -1116,13 +1142,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 +1178,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 +1235,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 +1274,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 +1325,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__