Start on --assemble support for DDF
This commit is contained in:
parent
2503d23b5a
commit
a19c88b83d
36
Assemble.c
36
Assemble.c
|
@ -843,6 +843,24 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
/* Almost ready to actually *do* something */
|
/* Almost ready to actually *do* something */
|
||||||
if (!old_linux) {
|
if (!old_linux) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
#ifndef MDASSEMBLE
|
||||||
|
struct mdinfo *sra;
|
||||||
|
if (st->ss->external) {
|
||||||
|
char ver[100];
|
||||||
|
strcat(strcpy(ver, "external:"), st->ss->text_version);
|
||||||
|
sra = sysfs_read(mdfd, 0, 0);
|
||||||
|
if ((vers % 100) < 2 ||
|
||||||
|
sra == NULL ||
|
||||||
|
sysfs_set_str(sra, NULL, "metadata_version",
|
||||||
|
ver) < 0) {
|
||||||
|
fprintf(stderr, Name ": This kernel does not "
|
||||||
|
"support external metadata.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
rv = sysfs_set_array(sra, &info);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
if ((vers % 100) >= 1) { /* can use different versions */
|
if ((vers % 100) >= 1) { /* can use different versions */
|
||||||
mdu_array_info_t inf;
|
mdu_array_info_t inf;
|
||||||
memset(&inf, 0, sizeof(inf));
|
memset(&inf, 0, sizeof(inf));
|
||||||
|
@ -893,8 +911,22 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
|
||||||
j = chosen_drive;
|
j = chosen_drive;
|
||||||
|
|
||||||
if (j >= 0 /* && devices[j].uptodate */) {
|
if (j >= 0 /* && devices[j].uptodate */) {
|
||||||
if (ioctl(mdfd, ADD_NEW_DISK,
|
#ifndef MDASSEMBLE
|
||||||
&devices[j].i.disk)!=0) {
|
if (st->ss->external) {
|
||||||
|
int fd = dev_open(devices[j].devname,
|
||||||
|
O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
rv = 1;
|
||||||
|
else {
|
||||||
|
rv = sysfs_add_disk(sra, fd,
|
||||||
|
&devices[j].i);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
rv = ioctl(mdfd, ADD_NEW_DISK,
|
||||||
|
&devices[j].i.disk);
|
||||||
|
if (rv) {
|
||||||
fprintf(stderr, Name ": failed to add "
|
fprintf(stderr, Name ": failed to add "
|
||||||
"%s to %s: %s\n",
|
"%s to %s: %s\n",
|
||||||
devices[j].devname,
|
devices[j].devname,
|
||||||
|
|
40
super-ddf.c
40
super-ddf.c
|
@ -1149,6 +1149,7 @@ static void uuid_from_super_ddf(struct supertype *st, int uuid[4])
|
||||||
static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info)
|
static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info)
|
||||||
{
|
{
|
||||||
struct ddf_super *ddf = st->sb;
|
struct ddf_super *ddf = st->sb;
|
||||||
|
int i;
|
||||||
|
|
||||||
info->array.major_version = 1000;
|
info->array.major_version = 1000;
|
||||||
info->array.minor_version = 0; /* FIXME use ddf->revision somehow */
|
info->array.minor_version = 0; /* FIXME use ddf->revision somehow */
|
||||||
|
@ -1167,9 +1168,17 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info)
|
||||||
|
|
||||||
info->disk.major = 0;
|
info->disk.major = 0;
|
||||||
info->disk.minor = 0;
|
info->disk.minor = 0;
|
||||||
// info->disk.number = __be32_to_cpu(ddf->disk.refnum);
|
info->disk.number = __be32_to_cpu(ddf->dlist->disk.refnum);
|
||||||
// info->disk.raid_disk = find refnum in the table and use index;
|
// info->disk.raid_disk = find refnum in the table and use index;
|
||||||
// info->disk.state = ???;
|
info->disk.raid_disk = -1;
|
||||||
|
for (i = 0; i < __be16_to_cpu(ddf->phys->max_pdes) ; i++)
|
||||||
|
if (ddf->phys->entries[i].refnum == ddf->dlist->disk.refnum) {
|
||||||
|
info->disk.raid_disk = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
info->disk.state = (1 << MD_DISK_SYNC);
|
||||||
|
|
||||||
|
info->reshape_active = 0;
|
||||||
|
|
||||||
// uuid_from_super_ddf(info->uuid, sbv);
|
// uuid_from_super_ddf(info->uuid, sbv);
|
||||||
|
|
||||||
|
@ -2248,6 +2257,31 @@ static int store_zero_ddf(struct supertype *st, int fd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int compare_super_ddf(struct supertype *st, struct supertype *tst)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* return:
|
||||||
|
* 0 same, or first was empty, and second was copied
|
||||||
|
* 1 second had wrong number
|
||||||
|
* 2 wrong uuid
|
||||||
|
* 3 wrong other info
|
||||||
|
*/
|
||||||
|
struct ddf_super *first = st->sb;
|
||||||
|
struct ddf_super *second = tst->sb;
|
||||||
|
|
||||||
|
if (!first) {
|
||||||
|
st->sb = tst->sb;
|
||||||
|
tst->sb = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp(first->anchor.guid, second->anchor.guid, DDF_GUID_LEN) != 0)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
/* FIXME should I look at anything else? */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct superswitch super_ddf = {
|
struct superswitch super_ddf = {
|
||||||
#ifndef MDASSEMBLE
|
#ifndef MDASSEMBLE
|
||||||
.examine_super = examine_super_ddf,
|
.examine_super = examine_super_ddf,
|
||||||
|
@ -2263,6 +2297,8 @@ struct superswitch super_ddf = {
|
||||||
|
|
||||||
.avail_size = avail_size_ddf,
|
.avail_size = avail_size_ddf,
|
||||||
|
|
||||||
|
.compare_super = compare_super_ddf,
|
||||||
|
|
||||||
.load_super = load_super_ddf,
|
.load_super = load_super_ddf,
|
||||||
.init_super = init_zero_ddf,
|
.init_super = init_zero_ddf,
|
||||||
.store_super = store_zero_ddf,
|
.store_super = store_zero_ddf,
|
||||||
|
|
Loading…
Reference in New Issue