X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=util.c;h=a695c45bf867b38977ac7ae1797b323ee1dbb0b1;hb=5e4ca8bb82e98400c9258cb3d7e4d030576f21df;hp=374015ede8d31f9f1646f71a24ae4f52353d40ba;hpb=efa295309fd2d85133aaf3c224cd5834b689234c;p=thirdparty%2Fmdadm.git diff --git a/util.c b/util.c index 374015ed..a695c45b 100644 --- a/util.c +++ b/util.c @@ -89,7 +89,6 @@ int dlm_funs_ready(void) return is_dlm_hooks_ready ? 1 : 0; } -#ifndef MDASSEMBLE static struct dlm_hooks *dlm_hooks = NULL; struct dlm_lock_resource *dlm_lock_res = NULL; static int ast_called = 0; @@ -200,16 +199,31 @@ int cluster_release_dlmlock(int lockid) out: return ret; } -#else -int cluster_get_dlmlock(int *lockid) + +/* + * Get array info from the kernel. Longer term we want to deprecate the + * ioctl and get it from sysfs. + */ +int md_get_array_info(int fd, struct mdu_array_info_s *array) { - return -1; + return ioctl(fd, GET_ARRAY_INFO, array); } -int cluster_release_dlmlock(int lockid) + +/* + * Set array info + */ +int md_set_array_info(int fd, struct mdu_array_info_s *array) { - return -1; + return ioctl(fd, SET_ARRAY_INFO, array); +} + +/* + * Get disk info from the kernel. + */ +int md_get_disk_info(int fd, struct mdu_disk_info_s *disk) +{ + return ioctl(fd, GET_DISK_INFO, disk); } -#endif /* * Parse a 128 bit uuid in 4 integers @@ -248,35 +262,6 @@ int parse_uuid(char *str, int uuid[4]) return 0; } -/* - * Get the md version number. - * We use the RAID_VERSION ioctl if it is supported - * If not, but we have a block device with major '9', we assume - * 0.36.0 - * - * Return version number as 24 but number - assume version parts - * always < 255 - */ - -int md_get_version(int fd) -{ - struct stat stb; - mdu_version_t vers; - - if (fstat(fd, &stb)<0) - return -1; - if ((S_IFMT&stb.st_mode) != S_IFBLK) - return -1; - - if (ioctl(fd, RAID_VERSION, &vers) == 0) - return (vers.major*10000) + (vers.minor*100) + vers.patchlevel; - if (errno == EACCES) - return -1; - if (major(stb.st_rdev) == MD_MAJOR) - return (3600); - return -1; -} - int get_linux_version() { struct utsname name; @@ -295,7 +280,6 @@ int get_linux_version() return (a*1000000)+(b*1000)+c; } -#ifndef MDASSEMBLE int mdadm_version(char *version) { int a, b, c; @@ -401,7 +385,6 @@ long parse_num(char *num) else return rv; } -#endif int parse_cluster_confirm_arg(char *input, char **devname, int *slot) { @@ -539,13 +522,12 @@ int enough_fd(int fd) int i, rv; char *avail; - if (ioctl(fd, GET_ARRAY_INFO, &array) != 0 || - array.raid_disks <= 0) + if (md_get_array_info(fd, &array) != 0 || array.raid_disks <= 0) return 0; avail = xcalloc(array.raid_disks, 1); for (i = 0; i < MAX_DISKS && array.nr_disks > 0; i++) { disk.number = i; - if (ioctl(fd, GET_DISK_INFO, &disk) != 0) + if (md_get_disk_info(fd, &disk) != 0) continue; if (disk.major == 0 && disk.minor == 0) continue; @@ -644,7 +626,6 @@ char *fname_from_uuid(struct supertype *st, struct mdinfo *info, char *buf, char return __fname_from_uuid(info->uuid, (st->ss == &super1) ? 1 : st->ss->swapuuid, buf, sep); } -#ifndef MDASSEMBLE int check_ext2(int fd, char *name) { /* @@ -748,7 +729,6 @@ int ask(char *mesg) pr_err("assuming 'no'\n"); return 0; } -#endif /* MDASSEMBLE */ int is_standard(char *dev, int *nump) { @@ -808,7 +788,6 @@ unsigned long calc_csum(void *super, int bytes) return csum; } -#ifndef MDASSEMBLE char *human_size(long long bytes) { static char buf[47]; @@ -900,7 +879,6 @@ void print_r10_layout(int layout) if (near*far == 1) printf("NO REDUNDANCY"); } -#endif unsigned long long calc_array_size(int level, int raid_disks, int layout, int chunksize, unsigned long long devsize) @@ -967,7 +945,6 @@ dev_t devnm2devid(char *devnm) return 0; } -#if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) char *get_md_name(char *devnm) { /* find /dev/md%d or /dev/md/%d or make a device /dev/.tmp.md%d */ @@ -1021,7 +998,6 @@ void put_md_name(char *name) if (strncmp(name, "/dev/.tmp.md", 12) == 0) unlink(name); } -#endif /* !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) */ int get_maj_min(char *dev, int *major, int *minor) { @@ -1151,9 +1127,8 @@ struct superswitch *superlist[] = &super0, &super1, &super_ddf, &super_imsm, &mbr, &gpt, - NULL }; - -#if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) + NULL +}; struct supertype *super_by_fd(int fd, char **subarrayp) { @@ -1175,7 +1150,7 @@ struct supertype *super_by_fd(int fd, char **subarrayp) minor = sra->array.minor_version; verstr = sra->text_version; } else { - if (ioctl(fd, GET_ARRAY_INFO, &array)) + if (md_get_array_info(fd, &array)) array.major_version = array.minor_version = 0; vers = array.major_version; minor = array.minor_version; @@ -1218,7 +1193,6 @@ struct supertype *super_by_fd(int fd, char **subarrayp) return st; } -#endif /* !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) */ int dev_size_from_id(dev_t id, unsigned long long *size) { @@ -1352,9 +1326,14 @@ int get_dev_sector_size(int fd, char *dname, unsigned int *sectsizep) */ int must_be_container(int fd) { + struct mdinfo *mdi; unsigned long long size; - if (md_get_version(fd) < 0) + + mdi = sysfs_read(fd, NULL, GET_VERSION); + if (!mdi) return 0; + sysfs_free(mdi); + if (get_dev_size(fd, NULL, &size) == 0) return 1; if (size == 0) @@ -1753,7 +1732,7 @@ int add_disk(int mdfd, struct supertype *st, { /* Add a device to an array, in one of 2 ways. */ int rv; -#ifndef MDASSEMBLE + if (st->ss->external) { if (info->disk.state & (1<recovery_start = MaxSector; @@ -1773,7 +1752,6 @@ int add_disk(int mdfd, struct supertype *st, } } } else -#endif rv = ioctl(mdfd, ADD_NEW_DISK, &info->disk); return rv; } @@ -1782,12 +1760,11 @@ int remove_disk(int mdfd, struct supertype *st, struct mdinfo *sra, struct mdinfo *info) { int rv; + /* Remove the disk given by 'info' from the array */ -#ifndef MDASSEMBLE if (st->ss->external) rv = sysfs_set_str(sra, info, "slot", "none"); else -#endif rv = ioctl(mdfd, HOT_REMOVE_DISK, makedev(info->disk.major, info->disk.minor)); return rv; @@ -1829,22 +1806,17 @@ int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info) * This varies between externally managed arrays * and older kernels */ - int vers = md_get_version(mdfd); + mdu_array_info_t inf; int rv; -#ifndef MDASSEMBLE if (st->ss->external) - rv = sysfs_set_array(info, vers); - else -#endif - if ((vers % 100) >= 1) { /* can use different versions */ - mdu_array_info_t inf; - memset(&inf, 0, sizeof(inf)); - inf.major_version = info->array.major_version; - inf.minor_version = info->array.minor_version; - rv = ioctl(mdfd, SET_ARRAY_INFO, &inf); - } else - rv = ioctl(mdfd, SET_ARRAY_INFO, NULL); + return sysfs_set_array(info, 9003); + + memset(&inf, 0, sizeof(inf)); + inf.major_version = info->array.major_version; + inf.minor_version = info->array.minor_version; + rv = md_set_array_info(mdfd, &inf); + return rv; } @@ -2018,7 +1990,6 @@ use_random: memcpy(buf, r, 16); } -#ifndef MDASSEMBLE int flush_metadata_updates(struct supertype *st) { int sfd; @@ -2060,7 +2031,6 @@ void append_metadata_update(struct supertype *st, void *buf, int len) *st->update_tail = mu; st->update_tail = &mu->next; } -#endif /* MDASSEMBLE */ #ifdef __TINYC__ /* tinyc doesn't optimize this check in ioctl.h out ... */ @@ -2200,7 +2170,6 @@ void reopen_mddev(int mdfd) dup2(fd, mdfd); } -#ifndef MDASSEMBLE static struct cmap_hooks *cmap_hooks = NULL; static int is_cmap_hooks_ready = 0; @@ -2275,4 +2244,3 @@ void set_hooks(void) set_dlm_hooks(); set_cmap_hooks(); } -#endif