X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Query.c;h=4cfcf5789b9b9e2901f1b009036d83dac182d68b;hb=005debfc11b4cbe653503667423df98b64e5be0e;hp=28450bd1d7107bf580e7bf221c168619cca81552;hpb=98c6faba80e6db0693f99faf5c6525ef4f1fb680;p=thirdparty%2Fmdadm.git diff --git a/Query.c b/Query.c index 28450bd1..4cfcf578 100644 --- a/Query.c +++ b/Query.c @@ -1,7 +1,7 @@ /* * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2002 Neil Brown + * Copyright (C) 2002-2006 Neil Brown * * * This program is free software; you can redistribute it and/or modify @@ -41,10 +41,12 @@ int Query(char *dev) int vers; int ioctlerr; int superror, superrno; - mdp_super_t super; + struct mdinfo info; mdu_array_info_t array; + void *super; + struct supertype *st = NULL; + unsigned long long larray_size; - unsigned long array_size; struct stat stb; char *mddev; mdu_disk_info_t disc; @@ -60,23 +62,13 @@ int Query(char *dev) if (ioctl(fd, GET_ARRAY_INFO, &array)<0) ioctlerr = errno; else ioctlerr = 0; - superror = load_super(fd, &super); - superrno = errno; fstat(fd, &stb); if (vers>=9000 && !ioctlerr) { -#ifdef BLKGETSIZE64 - if (ioctl(fd, BLKGETSIZE64, &larray_size)==0) - ; - else -#endif - if (ioctl(fd, BLKGETSIZE, &array_size)==0) { - larray_size = array_size; - larray_size <<= 9; - } else larray_size = 0; + if (!get_dev_size(fd, NULL, &larray_size)) + larray_size = 0; } - close(fd); if (vers < 0) printf("%s: is not an md array\n", dev); @@ -95,54 +87,43 @@ int Query(char *dev) array.raid_disks, array.spare_disks, array.spare_disks==1?"":"s"); } - switch(superror) { - case 1: - printf("%s: cannot find device size: %s\n", - dev, strerror(superrno)); - break; - case 2: - printf("%s: is too small to be an md component.\n", - dev); - break; - case 3: - printf("%s: Cannot seek to superblock: %s\n", - dev, strerror(superrno)); - break; - case 4: - printf("%s: Cannot read md superblock.\n", - dev); - break; - case 5: - printf("%s: No md super block found, not an md component.\n", - dev); - break; - case 6: - printf("%s: md superblock present with wrong version: %d\n", - dev, super.major_version); - break; - default: + st = guess_super(fd); + if (st) { + superror = st->ss->load_super(st, fd, &super, dev); + superrno = errno; + } else + superror = -1; + close(fd); + if (superror == 0) { /* array might be active... */ - mddev = get_md_name(super.md_minor); - disc.number = super.this_disk.number; - activity = "inactive"; - if (mddev && (fd = open(mddev, O_RDONLY))>=0) { - if (md_get_version(fd) >= 9000 && - ioctl(fd, GET_ARRAY_INFO, &array)>= 0) { - if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 && - MKDEV((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev) - activity = "active"; - else - activity = "mismatch"; + st->ss->getinfo_super(&info, super); + if (st->ss->major == 0) { + mddev = get_md_name(info.array.md_minor); + disc.number = info.disk.number; + activity = "undetected"; + if (mddev && (fd = open(mddev, O_RDONLY))>=0) { + if (md_get_version(fd) >= 9000 && + ioctl(fd, GET_ARRAY_INFO, &array)>= 0) { + if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 && + makedev((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev) + activity = "active"; + else + activity = "mismatch"; + } + close(fd); } - close(fd); + } else { + activity = "unknown"; + mddev = "array"; } - printf("%s: device %d in %d device %s %s md%d. Use mdadm --examine for more detail.\n", + printf("%s: device %d in %d device %s %s %s. Use mdadm --examine for more detail.\n", dev, - super.this_disk.number, super.raid_disks, + info.disk.number, info.array.raid_disks, activity, - map_num(pers, super.level), - super.md_minor); - break; + map_num(pers, info.array.level), + mddev); + if (st->ss->major == 0) + put_md_name(mddev); } return 0; }