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

@ -503,13 +503,6 @@ struct ddf_super {
static int load_super_ddf_all(struct supertype *st, int fd,
void **sbp, char *devname);
static int get_svd_state(const struct ddf_super *, const struct vcl *);
static int
validate_geometry_ddf_container(struct supertype *st,
int level, int layout, int raiddisks,
int chunk, unsigned long long size,
unsigned long long data_offset,
char *dev, unsigned long long *freesize,
int verbose);
static int validate_geometry_ddf_bvd(struct supertype *st,
int level, int layout, int raiddisks,
@ -1477,13 +1470,13 @@ static void examine_vds(struct ddf_super *sb)
printf("\n");
printf(" unit[%d] : %d\n", i, be16_to_cpu(ve->unit));
printf(" state[%d] : %s, %s%s\n", i,
map_num(ddf_state, ve->state & 7),
map_num_s(ddf_state, ve->state & 7),
(ve->state & DDF_state_morphing) ? "Morphing, ": "",
(ve->state & DDF_state_inconsistent)? "Not Consistent" : "Consistent");
printf(" init state[%d] : %s\n", i,
map_num(ddf_init_state, ve->init_state&DDF_initstate_mask));
map_num_s(ddf_init_state, ve->init_state & DDF_initstate_mask));
printf(" access[%d] : %s\n", i,
map_num(ddf_access, (ve->init_state & DDF_access_mask) >> 6));
map_num_s(ddf_access, (ve->init_state & DDF_access_mask) >> 6));
printf(" Name[%d] : %.16s\n", i, ve->name);
examine_vd(i, sb, ve->guid);
}
@ -2146,75 +2139,6 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha
}
}
static int update_super_ddf(struct supertype *st, struct mdinfo *info,
char *update,
char *devname, int verbose,
int uuid_set, char *homehost)
{
/* For 'assemble' and 'force' we need to return non-zero if any
* change was made. For others, the return value is ignored.
* Update options are:
* force-one : This device looks a bit old but needs to be included,
* update age info appropriately.
* assemble: clear any 'faulty' flag to allow this device to
* be assembled.
* force-array: Array is degraded but being forced, mark it clean
* if that will be needed to assemble it.
*
* newdev: not used ????
* grow: Array has gained a new device - this is currently for
* linear only
* resync: mark as dirty so a resync will happen.
* uuid: Change the uuid of the array to match what is given
* homehost: update the recorded homehost
* name: update the name - preserving the homehost
* _reshape_progress: record new reshape_progress position.
*
* Following are not relevant for this version:
* sparc2.2 : update from old dodgey metadata
* super-minor: change the preferred_minor number
* summaries: update redundant counters.
*/
int rv = 0;
// struct ddf_super *ddf = st->sb;
// struct vd_config *vd = find_vdcr(ddf, info->container_member);
// struct virtual_entry *ve = find_ve(ddf);
/* we don't need to handle "force-*" or "assemble" as
* there is no need to 'trick' the kernel. When the metadata is
* first updated to activate the array, all the implied modifications
* will just happen.
*/
if (strcmp(update, "grow") == 0) {
/* FIXME */
} else if (strcmp(update, "resync") == 0) {
// info->resync_checkpoint = 0;
} else if (strcmp(update, "homehost") == 0) {
/* homehost is stored in controller->vendor_data,
* or it is when we are the vendor
*/
// if (info->vendor_is_local)
// strcpy(ddf->controller.vendor_data, homehost);
rv = -1;
} else if (strcmp(update, "name") == 0) {
/* name is stored in virtual_entry->name */
// memset(ve->name, ' ', 16);
// strncpy(ve->name, info->name, 16);
rv = -1;
} else if (strcmp(update, "_reshape_progress") == 0) {
/* We don't support reshape yet */
} else if (strcmp(update, "assemble") == 0 ) {
/* Do nothing, just succeed */
rv = 0;
} else
rv = -1;
// update_all_csum(ddf);
return rv;
}
static void make_header_guid(char *guid)
{
be32 stamp;
@ -3322,6 +3246,42 @@ static int reserve_space(struct supertype *st, int raiddisks,
return 1;
}
static int
validate_geometry_ddf_container(struct supertype *st,
int level, int raiddisks,
unsigned long long data_offset,
char *dev, unsigned long long *freesize,
int verbose)
{
int fd;
unsigned long long ldsize;
if (!is_container(level))
return 0;
if (!dev)
return 1;
fd = dev_open(dev, O_RDONLY|O_EXCL);
if (fd < 0) {
if (verbose)
pr_err("ddf: Cannot open %s: %s\n",
dev, strerror(errno));
return 0;
}
if (!get_dev_size(fd, dev, &ldsize)) {
close(fd);
return 0;
}
close(fd);
if (freesize) {
*freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
if (*freesize == 0)
return 0;
}
return 1;
}
static int validate_geometry_ddf(struct supertype *st,
int level, int layout, int raiddisks,
int *chunk, unsigned long long size,
@ -3340,20 +3300,18 @@ static int validate_geometry_ddf(struct supertype *st,
* If given BVDs, we make an SVD, changing all the GUIDs in the process.
*/
if (*chunk == UnSet)
*chunk = DEFAULT_CHUNK;
if (level == LEVEL_NONE)
level = LEVEL_CONTAINER;
if (level == LEVEL_CONTAINER) {
if (is_container(level)) {
/* Must be a fresh device to add to a container */
return validate_geometry_ddf_container(st, level, layout,
raiddisks, *chunk,
size, data_offset, dev,
freesize,
verbose);
return validate_geometry_ddf_container(st, level, raiddisks,
data_offset, dev,
freesize, verbose);
}
if (*chunk == UnSet)
*chunk = DEFAULT_CHUNK;
if (!dev) {
mdu_array_info_t array = {
.level = level,
@ -3449,43 +3407,6 @@ static int validate_geometry_ddf(struct supertype *st,
return 1;
}
static int
validate_geometry_ddf_container(struct supertype *st,
int level, int layout, int raiddisks,
int chunk, unsigned long long size,
unsigned long long data_offset,
char *dev, unsigned long long *freesize,
int verbose)
{
int fd;
unsigned long long ldsize;
if (level != LEVEL_CONTAINER)
return 0;
if (!dev)
return 1;
fd = dev_open(dev, O_RDONLY|O_EXCL);
if (fd < 0) {
if (verbose)
pr_err("ddf: Cannot open %s: %s\n",
dev, strerror(errno));
return 0;
}
if (!get_dev_size(fd, dev, &ldsize)) {
close(fd);
return 0;
}
close(fd);
if (freesize) {
*freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
if (*freesize == 0)
return 0;
}
return 1;
}
static int validate_geometry_ddf_bvd(struct supertype *st,
int level, int layout, int raiddisks,
int *chunk, unsigned long long size,
@ -3498,7 +3419,7 @@ static int validate_geometry_ddf_bvd(struct supertype *st,
struct dl *dl;
unsigned long long maxsize;
/* ddf/bvd supports lots of things, but not containers */
if (level == LEVEL_CONTAINER) {
if (is_container(level)) {
if (verbose)
pr_err("DDF cannot create a container within an container\n");
return 0;
@ -5125,13 +5046,16 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
*/
vc = find_vdcr(ddf, a->info.container_member, rv->disk.raid_disk,
&n_bvd, &vcl);
if (vc == NULL)
if (vc == NULL) {
free(rv);
return NULL;
}
mu = xmalloc(sizeof(*mu));
if (posix_memalign(&mu->space, 512, sizeof(struct vcl)) != 0) {
free(mu);
mu = NULL;
free(rv);
return NULL;
}
mu->len = ddf->conf_rec_len * 512 * vcl->conf.sec_elmnt_count;
@ -5161,6 +5085,8 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
pr_err("BUG: can't find disk %d (%d/%d)\n",
di->disk.raid_disk,
di->disk.major, di->disk.minor);
free(mu);
free(rv);
return NULL;
}
vc->phys_refnum[i_prim] = ddf->phys->entries[dl->pdnum].refnum;
@ -5216,7 +5142,6 @@ struct superswitch super_ddf = {
.match_home = match_home_ddf,
.uuid_from_super= uuid_from_super_ddf,
.getinfo_super = getinfo_super_ddf,
.update_super = update_super_ddf,
.avail_size = avail_size_ddf,