}
}
-int same_uuid(int a[4], int b[4])
+int same_uuid(int a[4], int b[4], int swapuuid)
{
- if (a[0]==b[0] &&
- a[1]==b[1] &&
- a[2]==b[2] &&
- a[3]==b[3])
- return 1;
- return 0;
+ if (swapuuid) {
+ /* parse uuids are hostendian.
+ * uuid's from some superblocks are big-ending
+ * if there is a difference, we need to swap..
+ */
+ unsigned char *ac = (unsigned char *)a;
+ unsigned char *bc = (unsigned char *)b;
+ int i;
+ for (i=0; i<16; i+= 4) {
+ if (ac[i+0] != bc[i+3] ||
+ ac[i+1] != bc[i+2] ||
+ ac[i+2] != bc[i+1] ||
+ ac[i+3] != bc[i+0])
+ return 0;
+ }
+ return 1;
+ } else {
+ if (a[0]==b[0] &&
+ a[1]==b[1] &&
+ a[2]==b[2] &&
+ a[3]==b[3])
+ return 1;
+ return 0;
+ }
}
int check_ext2(int fd, char *name)
{
void *super;
struct mdinfo info;
+ struct mddev_ident_s ident;
time_t crtime;
+ char *level;
struct supertype *st = guess_super(fd);
if (!st) return 0;
/* Looks like a raid array .. */
fprintf(stderr, Name ": %s appears to be part of a raid array:\n",
name);
- st->ss->getinfo_super(&info, super);
+ st->ss->getinfo_super(&info, &ident, super);
free(super);
crtime = info.array.ctime;
- fprintf(stderr, " level=%d devices=%d ctime=%s",
- info.array.level, info.array.raid_disks, ctime(&crtime));
+ level = map_num(pers, info.array.level);
+ if (!level) level = "-unknown-";
+ fprintf(stderr, " level=%s devices=%d ctime=%s",
+ level, info.array.raid_disks, ctime(&crtime));
return 1;
}
else if (bytes < 2*1024LL*1024LL*1024LL) {
long cMiB = (bytes / ( (1LL<<20) / 200LL ) +1) /2;
long cMB = (bytes / ( 1000000LL / 200LL ) +1) /2;
- sprintf(buf, " (%ld.%02ld MiB %ld.%02ld MB)",
+ snprintf(buf, sizeof(buf), " (%ld.%02ld MiB %ld.%02ld MB)",
cMiB/100 , cMiB % 100,
cMB/100, cMB % 100);
} else {
long cGiB = (bytes / ( (1LL<<30) / 200LL ) +1) /2;
long cGB = (bytes / (1000000000LL/200LL ) +1) /2;
- sprintf(buf, " (%ld.%02ld GiB %ld.%02ld GB)",
+ snprintf(buf, sizeof(buf), " (%ld.%02ld GiB %ld.%02ld GB)",
cGiB/100 , cGiB % 100,
cGB/100, cGB % 100);
}
if (bytes < 5000*1024)
- sprintf(buf, "%ld.%02ldKiB",
+ snprintf(buf, sizeof(buf), "%ld.%02ldKiB",
(long)(bytes>>10), (long)(((bytes&1023)*100+512)/1024)
);
else if (bytes < 2*1024LL*1024LL*1024LL)
- sprintf(buf, "%ld.%02ldMiB",
+ snprintf(buf, sizeof(buf), "%ld.%02ldMiB",
(long)(bytes>>20),
(long)((bytes&0xfffff)+0x100000/200)/(0x100000/100)
);
else
- sprintf(buf, "%ld.%02ldGiB",
+ snprintf(buf, sizeof(buf), "%ld.%02ldGiB",
(long)(bytes>>30),
(long)(((bytes>>10)&0xfffff)+0x100000/200)/(0x100000/100)
);
int mdp = get_mdp_major();
if (mdp < 0) return NULL;
rdev = makedev(mdp, (-1-dev)<<6);
- sprintf(devname, "/dev/md/d%d", -1-dev);
+ snprintf(devname, sizeof(devname), "/dev/md/d%d", -1-dev);
if (stat(devname, &stb) == 0
&& (S_IFMT&stb.st_mode) == S_IFBLK
&& (stb.st_rdev == rdev))
return devname;
} else {
rdev = makedev(MD_MAJOR, dev);
- sprintf(devname, "/dev/md%d", dev);
+ snprintf(devname, sizeof(devname), "/dev/md%d", dev);
if (stat(devname, &stb) == 0
&& (S_IFMT&stb.st_mode) == S_IFBLK
&& (stb.st_rdev == rdev))
return devname;
- sprintf(devname, "/dev/md/%d", dev);
+ snprintf(devname, sizeof(devname), "/dev/md/%d", dev);
if (stat(devname, &stb) == 0
&& (S_IFMT&stb.st_mode) == S_IFBLK
&& (stb.st_rdev == rdev))
dn = map_dev(major(rdev), minor(rdev));
if (dn)
return dn;
- sprintf(devname, "/dev/.tmp.md%d", dev);
+ snprintf(devname, sizeof(devname), "/dev/.tmp.md%d", dev);
if (mknod(devname, S_IFBLK | 0600, rdev) == -1)
if (errno != EEXIST)
return NULL;
-
struct superswitch *superlist[] = { &super0, &super1, NULL };
struct supertype *super_by_version(int vers, int minor)
for (i=0 ; superlist[i]; i++) {
int rv;
ss = superlist[i];
+ st->ss = NULL;
rv = ss->load_super(st, fd, &sbp, NULL);
if (rv == 0) {
struct mdinfo info;
- ss->getinfo_super(&info, sbp);
+ struct mddev_ident_s ident;
+ ss->getinfo_super(&info, &ident, sbp);
if (bestsuper == -1 ||
besttime < info.array.ctime) {
bestsuper = i;
besttime = info.array.ctime;
}
- st->ss = NULL;
free(sbp);
}
}
if (bestsuper != -1) {
int rv;
+ st->ss = NULL;
rv = superlist[bestsuper]->load_super(st, fd, &sbp, NULL);
if (rv == 0) {
free(sbp);
free(st);
return NULL;
}
+
+#ifdef __TINYC__
+/* tinyc doesn't optimize this check in ioctl.h out ... */
+unsigned int __invalid_size_argument_for_IOC = 0;
+#endif
+