Remove st->text_version in favour of info->text_version
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.
This commit is contained in:
parent
ed9d66aade
commit
159c3a1a77
|
@ -848,7 +848,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
struct mdinfo *sra;
|
struct mdinfo *sra;
|
||||||
if (st->ss->external) {
|
if (st->ss->external) {
|
||||||
char ver[100];
|
char ver[100];
|
||||||
strcat(strcpy(ver, "external:"), st->ss->text_version);
|
strcat(strcpy(ver, "external:"), info.text_version);
|
||||||
sra = sysfs_read(mdfd, 0, 0);
|
sra = sysfs_read(mdfd, 0, 0);
|
||||||
if ((vers % 100) < 2 ||
|
if ((vers % 100) < 2 ||
|
||||||
sra == NULL ||
|
sra == NULL ||
|
||||||
|
|
5
Create.c
5
Create.c
|
@ -512,6 +512,8 @@ int Create(struct supertype *st, char *mddev, int mdfd,
|
||||||
if (!st->ss->init_super(st, &info.array, size, name, homehost, uuid))
|
if (!st->ss->init_super(st, &info.array, size, name, homehost, uuid))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
st->ss->getinfo_super(st, &info);
|
||||||
|
|
||||||
if (bitmap_file && vers < 9003) {
|
if (bitmap_file && vers < 9003) {
|
||||||
major_num = BITMAP_MAJOR_HOSTENDIAN;
|
major_num = BITMAP_MAJOR_HOSTENDIAN;
|
||||||
#ifdef __BIG_ENDIAN
|
#ifdef __BIG_ENDIAN
|
||||||
|
@ -541,7 +543,8 @@ int Create(struct supertype *st, char *mddev, int mdfd,
|
||||||
char ver[100];
|
char ver[100];
|
||||||
if (st->ss->external == 1)
|
if (st->ss->external == 1)
|
||||||
/* container */
|
/* container */
|
||||||
strcat(strcpy(ver, "external:"), st->ss->text_version);
|
strcat(strcpy(ver, "external:"),
|
||||||
|
info.text_version);
|
||||||
else {
|
else {
|
||||||
/* member */
|
/* member */
|
||||||
sprintf(ver, "external:/%s/%d",
|
sprintf(ver, "external:/%s/%d",
|
||||||
|
|
1
mdadm.h
1
mdadm.h
|
@ -433,7 +433,6 @@ extern struct superswitch {
|
||||||
|
|
||||||
|
|
||||||
int major;
|
int major;
|
||||||
char *text_version;
|
|
||||||
int swapuuid; /* true if uuid is bigending rather than hostendian */
|
int swapuuid; /* true if uuid is bigending rather than hostendian */
|
||||||
int external;
|
int external;
|
||||||
} super0, super1, super_ddf, super_ddf_bvd, super_ddf_svd, *superlist[];
|
} super0, super1, super_ddf, super_ddf_bvd, super_ddf_svd, *superlist[];
|
||||||
|
|
10
super-ddf.c
10
super-ddf.c
|
@ -1212,6 +1212,8 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info)
|
||||||
|
|
||||||
info->reshape_active = 0;
|
info->reshape_active = 0;
|
||||||
|
|
||||||
|
strcpy(info->text_version, "ddf");
|
||||||
|
|
||||||
// uuid_from_super_ddf(info->uuid, sbv);
|
// uuid_from_super_ddf(info->uuid, sbv);
|
||||||
|
|
||||||
// info->name[] ?? ;
|
// info->name[] ?? ;
|
||||||
|
@ -1259,6 +1261,10 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info)
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
// info->name[] ?? ;
|
// info->name[] ?? ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2680,7 +2686,6 @@ struct superswitch super_ddf = {
|
||||||
.major = 1000,
|
.major = 1000,
|
||||||
.swapuuid = 0,
|
.swapuuid = 0,
|
||||||
.external = 1,
|
.external = 1,
|
||||||
.text_version = "ddf",
|
|
||||||
|
|
||||||
/* for mdmon */
|
/* for mdmon */
|
||||||
.open_new = ddf_open_new,
|
.open_new = ddf_open_new,
|
||||||
|
@ -2713,7 +2718,6 @@ struct superswitch super_ddf_container = {
|
||||||
.major = 1000,
|
.major = 1000,
|
||||||
.swapuuid = 0,
|
.swapuuid = 0,
|
||||||
.external = 1,
|
.external = 1,
|
||||||
.text_version = "ddf",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct superswitch super_ddf_bvd = {
|
struct superswitch super_ddf_bvd = {
|
||||||
|
@ -2737,7 +2741,6 @@ struct superswitch super_ddf_bvd = {
|
||||||
.major = 1001,
|
.major = 1001,
|
||||||
.swapuuid = 0,
|
.swapuuid = 0,
|
||||||
.external = 2,
|
.external = 2,
|
||||||
.text_version = "ddf",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct superswitch super_ddf_svd = {
|
struct superswitch super_ddf_svd = {
|
||||||
|
@ -2756,5 +2759,4 @@ struct superswitch super_ddf_svd = {
|
||||||
.major = 1002,
|
.major = 1002,
|
||||||
.swapuuid = 0,
|
.swapuuid = 0,
|
||||||
.external = 2,
|
.external = 2,
|
||||||
.text_version = "ddf",
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -443,11 +443,17 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info)
|
||||||
info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0;
|
info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0;
|
||||||
info->disk.state |= s & USABLE_DISK ? (1 << MD_DISK_SYNC) : 0;
|
info->disk.state |= s & USABLE_DISK ? (1 << MD_DISK_SYNC) : 0;
|
||||||
info->reshape_active = 0;
|
info->reshape_active = 0;
|
||||||
|
|
||||||
|
strcpy(info->text_version, "imsm");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getinfo_super_imsm_raid(struct supertype *st, struct mdinfo *info)
|
static void getinfo_super_imsm_raid(struct supertype *st, struct mdinfo *info)
|
||||||
{
|
{
|
||||||
printf("%s\n", __FUNCTION__);
|
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,
|
||||||
|
@ -1063,6 +1069,10 @@ static struct mdinfo *container_content_imsm(struct supertype *st)
|
||||||
strncpy(this->name, (char *) dev->volume, MAX_RAID_SERIAL_LEN);
|
strncpy(this->name, (char *) dev->volume, MAX_RAID_SERIAL_LEN);
|
||||||
this->name[MAX_RAID_SERIAL_LEN] = 0;
|
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));
|
memset(this->uuid, 0, sizeof(this->uuid));
|
||||||
|
|
||||||
sz = __le32_to_cpu(dev->size_high);
|
sz = __le32_to_cpu(dev->size_high);
|
||||||
|
@ -1352,7 +1362,6 @@ struct superswitch super_imsm = {
|
||||||
.major = 2000,
|
.major = 2000,
|
||||||
.swapuuid = 0,
|
.swapuuid = 0,
|
||||||
.external = 1,
|
.external = 1,
|
||||||
.text_version = "imsm",
|
|
||||||
|
|
||||||
/* for mdmon */
|
/* for mdmon */
|
||||||
.open_new = imsm_open_new,
|
.open_new = imsm_open_new,
|
||||||
|
@ -1389,7 +1398,6 @@ struct superswitch super_imsm_container = {
|
||||||
.major = 2000,
|
.major = 2000,
|
||||||
.swapuuid = 0,
|
.swapuuid = 0,
|
||||||
.external = 1,
|
.external = 1,
|
||||||
.text_version = "imsm",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct superswitch super_imsm_raid = {
|
struct superswitch super_imsm_raid = {
|
||||||
|
@ -1409,5 +1417,4 @@ struct superswitch super_imsm_raid = {
|
||||||
.major = 2001,
|
.major = 2001,
|
||||||
.swapuuid = 0,
|
.swapuuid = 0,
|
||||||
.external = 2,
|
.external = 2,
|
||||||
.text_version = "imsm",
|
|
||||||
};
|
};
|
||||||
|
|
29
util.c
29
util.c
|
@ -834,30 +834,19 @@ struct supertype *super_by_fd(int fd)
|
||||||
#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;
|
struct supertype *st;
|
||||||
char *verstr = NULL;
|
|
||||||
char version[20];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
|
st = malloc(sizeof(*st));
|
||||||
if (!st)
|
if (!st)
|
||||||
return st;
|
return st;
|
||||||
|
st->ss = orig->ss;
|
||||||
if (st->ss->text_version)
|
st->max_devs = orig->max_devs;
|
||||||
strcpy(version, st->ss->text_version);
|
st->minor_version = orig->minor_version;
|
||||||
else if (st->minor_version == -1)
|
st->sb = NULL;
|
||||||
sprintf(version, "%d", st->ss->major);
|
st->info = NULL;
|
||||||
else
|
return st;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct supertype *guess_super(int fd)
|
struct supertype *guess_super(int fd)
|
||||||
|
|
Loading…
Reference in New Issue