1
0
Fork 0

Merging upstream version 4.2+20230223.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-14 06:01:59 +01:00
parent 866376462c
commit 30ed170f74
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
76 changed files with 2282 additions and 1386 deletions

View file

@ -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");