st = tst;
if (st->ss != tst->ss ||
st->minor_version != tst->minor_version ||
- st->ss->compare_super(&first_super, super) != 0) {
+ st->ss->compare_super(st, tst) != 0) {
/* Some mismatch. If exactly one array matches this host,
* we can resolve on that one.
* Or, if we are auto assembling, we just ignore the second
char *d;
for (ap=arrays; ap; ap=ap->next) {
if (st->ss == ap->st->ss &&
- st->ss->compare_super(&ap->super, super)==0)
+ st->ss->compare_super(ap->st, st)==0)
break;
}
if (!ap) {
void (*add_to_super)(struct supertype *st, void *sbv, mdu_disk_info_t *dinfo);
int (*store_super)(struct supertype *st, int fd, void *sbv);
int (*write_init_super)(struct supertype *st, void *sbv, mdu_disk_info_t *dinfo, char *devname);
- int (*compare_super)(void **firstp, void *secondv);
+ int (*compare_super)(struct supertype *st, struct supertype *tst);
int (*load_super)(struct supertype *st, int fd, void **sbp, char *devname);
struct supertype * (*match_metadata_desc)(char *arg);
__u64 (*avail_size)(struct supertype *st, __u64 size);
struct superswitch *ss;
int minor_version;
int max_devs;
+ void *sb;
};
extern struct supertype *super_by_version(int vers, int minor);
extern void uuid_from_super(int uuid[4], mdp_super_t *super);
extern int same_uuid(int a[4], int b[4], int swapuuid);
extern void copy_uuid(void *a, int b[4], int swapuuid);
-/* extern int compare_super(mdp_super_t *first, mdp_super_t *second);*/
extern unsigned long calc_csum(void *super, int bytes);
extern int enough(int level, int raid_disks, int layout, int clean,
char *avail, int avail_disks);
int spares;
memset(sb, 0, MD_SB_BYTES + sizeof(bitmap_super_t));
+ st->sb = sb;
if (info->major_version == -1) {
/* zeroing the superblock */
*sbp = sb;
return rv;
}
-static int compare_super0(void **firstp, void *secondv)
+static int compare_super0(struct supertype *st, struct supertype *tst)
{
/*
* return:
* 2 wrong uuid
* 3 wrong other info
*/
- mdp_super_t *first = *firstp;
- mdp_super_t *second = secondv;
-
+ mdp_super_t *first = st->sb;
+ mdp_super_t *second = tst->sb;
int uuid1[4], uuid2[4];
+
if (second->md_magic != MD_SB_MAGIC)
return 1;
if (!first) {
first = malloc(MD_SB_BYTES + sizeof(struct bitmap_super_s));
memcpy(first, second, MD_SB_BYTES + sizeof(struct bitmap_super_s));
- *firstp = first;
+ st->sb = first;
return 0;
}
free(super);
return 2;
}
+ st->sb = super;
*sbp = super;
if (st->ss == NULL) {
st->ss = &super0;
st->ss = &super0;
st->minor_version = 90;
st->max_devs = MD_SB_DISKS;
+ st->sb = NULL;
if (strcmp(arg, "0") == 0 ||
strcmp(arg, "0.90") == 0 ||
strcmp(arg, "default") == 0
char defname[10];
memset(sb, 0, 1024);
+ st->sb = sb;
if (info->major_version == -1) {
/* zeroing superblock */
*sbp = sb;
return rv;
}
-static int compare_super1(void **firstp, void *secondv)
+static int compare_super1(struct supertype *st, struct supertype *tst)
{
/*
* return:
* 2 wrong uuid
* 3 wrong other info
*/
- struct mdp_superblock_1 *first = *firstp;
- struct mdp_superblock_1 *second = secondv;
+ struct mdp_superblock_1 *first = st->sb;
+ struct mdp_superblock_1 *second = tst->sb;
if (second->magic != __cpu_to_le32(MD_SB_MAGIC))
return 1;
sizeof(struct misc_dev_info));
memcpy(first, second, 1024+sizeof(bitmap_super_t) +
sizeof(struct misc_dev_info));
- *firstp = first;
+ st->sb = first;
return 0;
}
if (memcmp(first->set_uuid, second->set_uuid, 16)!= 0)
free(super);
return 2;
}
+ st->sb = super;
*sbp = super;
bsb = (struct bitmap_super_s *)(((char*)super)+1024);
st->ss = &super1;
st->max_devs = 384;
+ st->sb = NULL;
if (strcmp(arg, "1.0") == 0) {
st->minor_version = 0;
return st;