diff options
Diffstat (limited to 'Create.c')
-rw-r--r-- | Create.c | 89 |
1 files changed, 52 insertions, 37 deletions
@@ -39,39 +39,54 @@ static int round_size_and_verify(unsigned long long *size, int chunk) return 0; } -static int default_layout(struct supertype *st, int level, int verbose) +/** + * default_layout() - Get default layout for level. + * @st: metadata requested, could be NULL. + * @level: raid level requested. + * @verbose: verbose level. + * + * Try to ask metadata handler first, otherwise use global defaults. + * + * Return: Layout or &UnSet, return value meaning depends of level used. + */ +int default_layout(struct supertype *st, int level, int verbose) { int layout = UnSet; + mapping_t *layout_map = NULL; + char *layout_name = NULL; if (st && st->ss->default_geometry) st->ss->default_geometry(st, &level, &layout, NULL); - if (layout == UnSet) - switch(level) { - default: /* no layout */ - layout = 0; - break; - case 0: - layout = RAID0_ORIG_LAYOUT; - break; - case 10: - layout = 0x102; /* near=2, far=1 */ - if (verbose > 0) - pr_err("layout defaults to n2\n"); - break; - case 5: - case 6: - layout = map_name(r5layout, "default"); - if (verbose > 0) - pr_err("layout defaults to %s\n", map_num(r5layout, layout)); - break; - case LEVEL_FAULTY: - layout = map_name(faultylayout, "default"); + if (layout != UnSet) + return layout; - if (verbose > 0) - pr_err("layout defaults to %s\n", map_num(faultylayout, layout)); - break; - } + switch (level) { + default: /* no layout */ + layout = 0; + break; + case 0: + layout = RAID0_ORIG_LAYOUT; + break; + case 10: + layout = 0x102; /* near=2, far=1 */ + layout_name = "n2"; + break; + case 5: + case 6: + layout_map = r5layout; + break; + case LEVEL_FAULTY: + layout_map = faultylayout; + break; + } + + if (layout_map) { + layout = map_name(layout_map, "default"); + layout_name = map_num_s(layout_map, layout); + } + if (layout_name && verbose > 0) + pr_err("layout defaults to %s\n", layout_name); return layout; } @@ -80,7 +95,7 @@ int Create(struct supertype *st, char *mddev, char *name, int *uuid, int subdevs, struct mddev_dev *devlist, struct shape *s, - struct context *c, unsigned long long data_offset) + struct context *c) { /* * Create a new raid array. @@ -273,7 +288,7 @@ int Create(struct supertype *st, char *mddev, newsize = s->size * 2; if (st && ! st->ss->validate_geometry(st, s->level, s->layout, s->raiddisks, &s->chunk, s->size*2, - data_offset, NULL, + s->data_offset, NULL, &newsize, s->consistency_policy, c->verbose >= 0)) return 1; @@ -308,10 +323,10 @@ int Create(struct supertype *st, char *mddev, info.array.working_disks = 0; dnum = 0; for (dv = devlist; dv; dv = dv->next) - if (data_offset == VARIABLE_OFFSET) + if (s->data_offset == VARIABLE_OFFSET) dv->data_offset = INVALID_SECTORS; else - dv->data_offset = data_offset; + dv->data_offset = s->data_offset; for (dv=devlist; dv && !have_container; dv=dv->next, dnum++) { char *dname = dv->devname; @@ -327,7 +342,7 @@ int Create(struct supertype *st, char *mddev, missing_disks ++; continue; } - if (data_offset == VARIABLE_OFFSET) { + if (s->data_offset == VARIABLE_OFFSET) { doff = strchr(dname, ':'); if (doff) { *doff++ = 0; @@ -335,7 +350,7 @@ int Create(struct supertype *st, char *mddev, } else dv->data_offset = INVALID_SECTORS; } else - dv->data_offset = data_offset; + dv->data_offset = s->data_offset; dfd = open(dname, O_RDONLY); if (dfd < 0) { @@ -472,7 +487,7 @@ int Create(struct supertype *st, char *mddev, st->minor_version >= 1) /* metadata at front */ warn |= check_partitions(fd, dname, 0, 0); - else if (s->level == 1 || s->level == LEVEL_CONTAINER || + else if (s->level == 1 || is_container(s->level) || (s->level == 0 && s->raiddisks == 1)) /* partitions could be meaningful */ warn |= check_partitions(fd, dname, freesize*2, s->size*2); @@ -520,7 +535,7 @@ int Create(struct supertype *st, char *mddev, if (!st->ss->validate_geometry(st, s->level, s->layout, s->raiddisks, &s->chunk, minsize*2, - data_offset, + s->data_offset, NULL, NULL, s->consistency_policy, 0)) { pr_err("devices too large for RAID level %d\n", s->level); @@ -739,7 +754,7 @@ int Create(struct supertype *st, char *mddev, } } if (!st->ss->init_super(st, &info.array, s, name, c->homehost, uuid, - data_offset)) + s->data_offset)) goto abort_locked; total_slots = info.array.nr_disks; @@ -982,7 +997,7 @@ int Create(struct supertype *st, char *mddev, * again returns container info. */ st->ss->getinfo_super(st, &info_new, NULL); - if (st->ss->external && s->level != LEVEL_CONTAINER && + if (st->ss->external && !is_container(s->level) && !same_uuid(info_new.uuid, info.uuid, 0)) { map_update(&map, fd2devnm(mdfd), info_new.text_version, @@ -1025,7 +1040,7 @@ int Create(struct supertype *st, char *mddev, map_unlock(&map); free(infos); - if (s->level == LEVEL_CONTAINER) { + if (is_container(s->level)) { /* No need to start. But we should signal udev to * create links */ sysfs_uevent(&info, "change"); |