X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=super-ddf.c;h=c28d8040895950c01c7adf9a5dedb96d05a8813e;hp=feb66212678324d83a085f4b064cd8cda8418c15;hb=148acb7baaa810b68d55df4c1784d6bd0dfd1b78;hpb=e223334fe720c927301712f6b4944d58e415ac96 diff --git a/super-ddf.c b/super-ddf.c index feb66212..c28d8040 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -1,7 +1,7 @@ /* * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2006-2007 Neil Brown + * Copyright (C) 2006-2009 Neil Brown * * * This program is free software; you can redistribute it and/or modify @@ -762,6 +762,9 @@ static int load_ddf_local(int fd, struct ddf_super *super, static int load_super_ddf_all(struct supertype *st, int fd, void **sbp, char *devname, int keep_fd); #endif + +static void free_super_ddf(struct supertype *st); + static int load_super_ddf(struct supertype *st, int fd, char *devname) { @@ -798,6 +801,8 @@ static int load_super_ddf(struct supertype *st, int fd, return 1; } + free_super_ddf(st); + if (posix_memalign((void**)&super, 512, sizeof(*super))!= 0) { fprintf(stderr, Name ": malloc of %zu failed.\n", sizeof(*super)); @@ -835,6 +840,18 @@ static int load_super_ddf(struct supertype *st, int fd, return rv; } + if (st->subarray[0]) { + struct vcl *v; + + for (v = super->conflist; v; v = v->next) + if (v->vcnum == atoi(st->subarray)) + super->currentconf = v; + if (!super->currentconf) { + free(super); + return 1; + } + } + /* Should possibly check the sections .... */ st->sb = super; @@ -1061,9 +1078,9 @@ static void examine_vd(int n, struct ddf_super *sb, char *guid) map_num(ddf_sec_level, vc->srl) ?: "-unknown-"); } printf(" Device Size[%d] : %llu\n", n, - __be64_to_cpu(vc->blocks)/2); + (unsigned long long)__be64_to_cpu(vc->blocks)/2); printf(" Array Size[%d] : %llu\n", n, - __be64_to_cpu(vc->array_blocks)/2); + (unsigned long long)__be64_to_cpu(vc->array_blocks)/2); } } @@ -1099,7 +1116,7 @@ static void examine_pds(struct ddf_super *sb) int i; struct dl *dl; printf(" Physical Disks : %d\n", cnt); - printf(" Number RefNo Size Device Type/State\n"); + printf(" Number RefNo Size Device Type/State\n"); for (i=0 ; iphys->entries[i]; @@ -1110,18 +1127,19 @@ static void examine_pds(struct ddf_super *sb) //printf("\n"); printf(" %3d %08x ", i, __be32_to_cpu(pd->refnum)); - printf("%lluK ", __be64_to_cpu(pd->config_size)>>1); + printf("%8lluK ", + (unsigned long long)__be64_to_cpu(pd->config_size)>>1); for (dl = sb->dlist; dl ; dl = dl->next) { if (dl->disk.refnum == pd->refnum) { char *dv = map_dev(dl->major, dl->minor, 0); if (dv) { - printf("%-10s", dv); + printf("%-15s", dv); break; } } } if (!dl) - printf("%10s",""); + printf("%15s",""); printf(" %s%s%s%s%s", (type&2) ? "active":"", (type&4) ? "Global-Spare":"", @@ -1161,7 +1179,7 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info); static void uuid_from_super_ddf(struct supertype *st, int uuid[4]); -static void brief_examine_super_ddf(struct supertype *st) +static void brief_examine_super_ddf(struct supertype *st, int verbose) { /* We just write a generic DDF ARRAY entry */ @@ -1171,7 +1189,6 @@ static void brief_examine_super_ddf(struct supertype *st) char nbuf[64]; getinfo_super_ddf(st, &info); fname_from_uuid(st, &info, nbuf, ':'); - printf("ARRAY metadata=ddf UUID=%s\n", nbuf + 5); for (i=0; i<__be16_to_cpu(ddf->virt->max_vdes); i++) { struct virtual_entry *ve = &ddf->virt->entries[i]; @@ -1186,6 +1203,7 @@ static void brief_examine_super_ddf(struct supertype *st) printf("ARRAY container=%s member=%d UUID=%s\n", nbuf+5, i, nbuf1+5); } + printf("ARRAY metadata=ddf UUID=%s\n", nbuf + 5); } static void export_examine_super_ddf(struct supertype *st) @@ -1373,6 +1391,7 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info) __be32_to_cpu(*(__u32*)(vc->conf.guid+16)); info->array.utime = DECADE + __be32_to_cpu(vc->conf.timestamp); info->array.chunk_size = 512 << vc->conf.chunk_shift; + info->custom_array_size = 0; if (cd >= 0 && cd < ddf->mppe) { info->data_offset = __be64_to_cpu(vc->lba_offset[cd]); @@ -1493,17 +1512,6 @@ static int update_super_ddf(struct supertype *st, struct mdinfo *info, return rv; } -__u32 random32(void) -{ - __u32 rv; - int rfd = open("/dev/urandom", O_RDONLY); - if (rfd < 0 || read(rfd, &rv, 4) != 4) - rv = random(); - if (rfd >= 0) - close(rfd); - return rv; -} - static void make_header_guid(char *guid) { __u32 stamp; @@ -2343,15 +2351,19 @@ static int __write_init_super_ddf(struct supertype *st, int do_close) static int write_init_super_ddf(struct supertype *st) { + struct ddf_super *ddf = st->sb; + struct vcl *currentconf = ddf->currentconf; + + /* we are done with currentconf reset it to point st at the container */ + ddf->currentconf = NULL; if (st->update_tail) { /* queue the virtual_disk and vd_config as metadata updates */ struct virtual_disk *vd; struct vd_config *vc; - struct ddf_super *ddf = st->sb; int len; - if (!ddf->currentconf) { + if (!currentconf) { int len = (sizeof(struct phys_disk) + sizeof(struct phys_disk_entry)); @@ -2370,14 +2382,14 @@ static int write_init_super_ddf(struct supertype *st) len = sizeof(struct virtual_disk) + sizeof(struct virtual_entry); vd = malloc(len); *vd = *ddf->virt; - vd->entries[0] = ddf->virt->entries[ddf->currentconf->vcnum]; - vd->populated_vdes = __cpu_to_be16(ddf->currentconf->vcnum); + vd->entries[0] = ddf->virt->entries[currentconf->vcnum]; + vd->populated_vdes = __cpu_to_be16(currentconf->vcnum); append_metadata_update(st, vd, len); /* Then the vd_config */ len = ddf->conf_rec_len * 512; vc = malloc(len); - memcpy(vc, &ddf->currentconf->conf, len); + memcpy(vc, ¤tconf->conf, len); append_metadata_update(st, vc, len); /* FIXME I need to close the fds! */ @@ -2918,6 +2930,8 @@ static struct mdinfo *container_content_ddf(struct supertype *st) if (vc->conf.phys_refnum[i] == 0xFFFFFFFF) continue; + this->array.working_disks++; + for (d = ddf->dlist; d ; d=d->next) if (d->disk.refnum == vc->conf.phys_refnum[i]) break; @@ -2925,8 +2939,6 @@ static struct mdinfo *container_content_ddf(struct supertype *st) /* Haven't found that one yet, maybe there are others */ continue; - this->array.working_disks++; - dev = malloc(sizeof(*dev)); memset(dev, 0, sizeof(*dev)); dev->next = this->devs;