X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=super-ddf.c;h=8153924e16fd33d001f96dc91e3135b65e06fbdf;hp=6455deeee148cd1a9cbc01b2e3f37115f612dc39;hb=37424f132cb3874fe51021b1b5e04445a3ba1bdb;hpb=8844e291492b82f4bae6129673fb383a309514c0 diff --git a/super-ddf.c b/super-ddf.c index 6455deee..8153924e 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 @@ -643,6 +643,7 @@ static int load_ddf_local(int fd, struct ddf_super *super, struct stat stb; char *conf; int i; + int confsec; int vnum; int max_virt_disks = __be16_to_cpu(super->active->max_vd_entries); unsigned long long dsize; @@ -693,11 +694,11 @@ static int load_ddf_local(int fd, struct ddf_super *super, 0); vnum = 0; - for (i = 0; - i < __be32_to_cpu(super->active->config_section_length); - i += super->conf_rec_len) { + for (confsec = 0; + confsec < __be32_to_cpu(super->active->config_section_length); + confsec += super->conf_rec_len) { struct vd_config *vd = - (struct vd_config *)((char*)conf + i*512); + (struct vd_config *)((char*)conf + confsec*512); struct vcl *vcl; if (vd->magic == DDF_SPARE_ASSIGN_MAGIC) { @@ -761,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) { @@ -781,24 +785,24 @@ static int load_super_ddf(struct supertype *st, int fd, /* 32M is a lower bound */ if (dsize <= 32*1024*1024) { - if (devname) { + if (devname) fprintf(stderr, Name ": %s is too small for ddf: " "size is %llu sectors.\n", devname, dsize>>9); - return 1; - } + return 1; } if (dsize & 511) { - if (devname) { + if (devname) fprintf(stderr, Name ": %s is an odd size for ddf: " "size is %llu bytes.\n", devname, dsize); - return 1; - } + 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)); @@ -836,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; @@ -1062,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); } } @@ -1100,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]; @@ -1111,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":"", @@ -1162,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 */ @@ -1172,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]; @@ -1187,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) @@ -1374,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]); @@ -2653,6 +2671,8 @@ validate_geometry_ddf_container(struct supertype *st, close(fd); *freesize = avail_size_ddf(st, ldsize >> 9); + if (*freesize == 0) + return 0; return 1; } @@ -2917,6 +2937,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; @@ -2924,8 +2946,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;