Merging upstream version 4.2+20230223.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
866376462c
commit
30ed170f74
76 changed files with 2282 additions and 1386 deletions
89
Create.c
89
Create.c
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue