I want the metadata handler to have more control over the 'version',
particularly for arrays which are members of containers.
So discard st->text_version and instead use info->text_version
which getinfo_super can initialise.
struct mdinfo *sra;
if (st->ss->external) {
char ver[100];
struct mdinfo *sra;
if (st->ss->external) {
char ver[100];
- strcat(strcpy(ver, "external:"), st->ss->text_version);
+ strcat(strcpy(ver, "external:"), info.text_version);
sra = sysfs_read(mdfd, 0, 0);
if ((vers % 100) < 2 ||
sra == NULL ||
sra = sysfs_read(mdfd, 0, 0);
if ((vers % 100) < 2 ||
sra == NULL ||
if (!st->ss->init_super(st, &info.array, size, name, homehost, uuid))
return 1;
if (!st->ss->init_super(st, &info.array, size, name, homehost, uuid))
return 1;
+ st->ss->getinfo_super(st, &info);
+
if (bitmap_file && vers < 9003) {
major_num = BITMAP_MAJOR_HOSTENDIAN;
#ifdef __BIG_ENDIAN
if (bitmap_file && vers < 9003) {
major_num = BITMAP_MAJOR_HOSTENDIAN;
#ifdef __BIG_ENDIAN
char ver[100];
if (st->ss->external == 1)
/* container */
char ver[100];
if (st->ss->external == 1)
/* container */
- strcat(strcpy(ver, "external:"), st->ss->text_version);
+ strcat(strcpy(ver, "external:"),
+ info.text_version);
else {
/* member */
sprintf(ver, "external:/%s/%d",
else {
/* member */
sprintf(ver, "external:/%s/%d",
int swapuuid; /* true if uuid is bigending rather than hostendian */
int external;
} super0, super1, super_ddf, super_ddf_bvd, super_ddf_svd, *superlist[];
int swapuuid; /* true if uuid is bigending rather than hostendian */
int external;
} super0, super1, super_ddf, super_ddf_bvd, super_ddf_svd, *superlist[];
info->reshape_active = 0;
info->reshape_active = 0;
+ strcpy(info->text_version, "ddf");
+
// uuid_from_super_ddf(info->uuid, sbv);
// info->name[] ?? ;
// uuid_from_super_ddf(info->uuid, sbv);
// info->name[] ?? ;
uuid_from_super_ddf(st, info->uuid);
uuid_from_super_ddf(st, info->uuid);
+ sprintf(info->text_version, "/%s/%d",
+ devnum2devname(st->container_dev),
+ info->container_member);
+
.major = 1000,
.swapuuid = 0,
.external = 1,
.major = 1000,
.swapuuid = 0,
.external = 1,
/* for mdmon */
.open_new = ddf_open_new,
/* for mdmon */
.open_new = ddf_open_new,
.major = 1000,
.swapuuid = 0,
.external = 1,
.major = 1000,
.swapuuid = 0,
.external = 1,
};
struct superswitch super_ddf_bvd = {
};
struct superswitch super_ddf_bvd = {
.major = 1001,
.swapuuid = 0,
.external = 2,
.major = 1001,
.swapuuid = 0,
.external = 2,
};
struct superswitch super_ddf_svd = {
};
struct superswitch super_ddf_svd = {
.major = 1002,
.swapuuid = 0,
.external = 2,
.major = 1002,
.swapuuid = 0,
.external = 2,
info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0;
info->disk.state |= s & USABLE_DISK ? (1 << MD_DISK_SYNC) : 0;
info->reshape_active = 0;
info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0;
info->disk.state |= s & USABLE_DISK ? (1 << MD_DISK_SYNC) : 0;
info->reshape_active = 0;
+
+ strcpy(info->text_version, "imsm");
}
static void getinfo_super_imsm_raid(struct supertype *st, struct mdinfo *info)
{
printf("%s\n", __FUNCTION__);
}
static void getinfo_super_imsm_raid(struct supertype *st, struct mdinfo *info)
{
printf("%s\n", __FUNCTION__);
+
+ sprintf(info->text_version, "/%s/%d",
+ devnum2devname(st->container_dev),
+ info->container_member); // FIXME is this even set here?
}
static int update_super_imsm(struct supertype *st, struct mdinfo *info,
}
static int update_super_imsm(struct supertype *st, struct mdinfo *info,
strncpy(this->name, (char *) dev->volume, MAX_RAID_SERIAL_LEN);
this->name[MAX_RAID_SERIAL_LEN] = 0;
strncpy(this->name, (char *) dev->volume, MAX_RAID_SERIAL_LEN);
this->name[MAX_RAID_SERIAL_LEN] = 0;
+ sprintf(this->text_version, "/%s/%d",
+ devnum2devname(st->container_dev),
+ this->container_member);
+
memset(this->uuid, 0, sizeof(this->uuid));
sz = __le32_to_cpu(dev->size_high);
memset(this->uuid, 0, sizeof(this->uuid));
sz = __le32_to_cpu(dev->size_high);
.major = 2000,
.swapuuid = 0,
.external = 1,
.major = 2000,
.swapuuid = 0,
.external = 1,
- .text_version = "imsm",
/* for mdmon */
.open_new = imsm_open_new,
/* for mdmon */
.open_new = imsm_open_new,
.major = 2000,
.swapuuid = 0,
.external = 1,
.major = 2000,
.swapuuid = 0,
.external = 1,
- .text_version = "imsm",
};
struct superswitch super_imsm_raid = {
};
struct superswitch super_imsm_raid = {
.major = 2001,
.swapuuid = 0,
.external = 2,
.major = 2001,
.swapuuid = 0,
.external = 2,
- .text_version = "imsm",
#endif /* !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) */
#endif /* !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) */
-struct supertype *dup_super(struct supertype *st)
+struct supertype *dup_super(struct supertype *orig)
- struct supertype *stnew = NULL;
- char *verstr = NULL;
- char version[20];
- int i;
+ st = malloc(sizeof(*st));
-
- if (st->ss->text_version)
- strcpy(version, st->ss->text_version);
- else if (st->minor_version == -1)
- sprintf(version, "%d", st->ss->major);
- else
- sprintf(version, "%d.%d", st->ss->major, st->minor_version);
- verstr = version;
-
- for (i = 0; stnew == NULL && superlist[i] ; i++)
- stnew = superlist[i]->match_metadata_desc(verstr);
-
- if (stnew)
- stnew->sb = NULL;
- return stnew;
+ st->ss = orig->ss;
+ st->max_devs = orig->max_devs;
+ st->minor_version = orig->minor_version;
+ st->sb = NULL;
+ st->info = NULL;
+ return st;
}
struct supertype *guess_super(int fd)
}
struct supertype *guess_super(int fd)