1
0
Fork 0

Merging upstream version 4.2+20231026.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-14 06:32:02 +01:00
parent bb079da599
commit a701b01644
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
30 changed files with 956 additions and 423 deletions

73
mdadm.c
View file

@ -690,20 +690,14 @@ int main(int argc, char *argv[])
case O(CREATE,'N'):
case O(ASSEMBLE,'N'):
case O(MISC,'N'):
if (ident.name[0]) {
pr_err("name cannot be set twice. Second value %s.\n", optarg);
exit(2);
}
if (mode == MISC && !c.subarray) {
pr_err("-N/--name only valid with --update-subarray in misc mode\n");
exit(2);
}
if (strlen(optarg) > 32) {
pr_err("name '%s' is too long, 32 chars max.\n",
optarg);
if (ident_set_name(&ident, optarg) != MDADM_STATUS_SUCCESS)
exit(2);
}
strcpy(ident.name, optarg);
continue;
case O(ASSEMBLE,'m'): /* super-minor for array */
@ -1290,37 +1284,33 @@ int main(int argc, char *argv[])
pr_err("an md device must be given in this mode\n");
exit(2);
}
if (ident_set_devname(&ident, devlist->devname) != MDADM_STATUS_SUCCESS)
exit(1);
if ((int)ident.super_minor == -2 && c.autof) {
pr_err("--super-minor=dev is incompatible with --auto\n");
exit(2);
}
if (mode == MANAGE || mode == GROW) {
mdfd = open_mddev(devlist->devname, 1);
mdfd = open_mddev(ident.devname, 1);
if (mdfd < 0)
exit(1);
ret = fstat(mdfd, &stb);
if (ret) {
pr_err("fstat failed on %s.\n", devlist->devname);
pr_err("fstat failed on %s.\n", ident.devname);
exit(1);
}
} else {
char *bname = basename(devlist->devname);
if (strlen(bname) > MD_NAME_MAX) {
pr_err("Name %s is too long.\n", devlist->devname);
exit(1);
}
ret = stat(devlist->devname, &stb);
ret = stat(ident.devname, &stb);
if (ident.super_minor == -2 && ret != 0) {
pr_err("--super-minor=dev given, and listed device %s doesn't exist.\n",
devlist->devname);
ident.devname);
exit(1);
}
if (!ret && !stat_is_md_dev(&stb)) {
pr_err("device %s exists but is not an md array.\n", devlist->devname);
pr_err("device %s exists but is not an md array.\n", ident.devname);
exit(1);
}
}
@ -1408,17 +1398,17 @@ int main(int argc, char *argv[])
case MANAGE:
/* readonly, add/remove, readwrite, runstop */
if (c.readonly > 0)
rv = Manage_ro(devlist->devname, mdfd, c.readonly);
rv = Manage_ro(ident.devname, mdfd, c.readonly);
if (!rv && devs_found > 1)
rv = Manage_subdevs(devlist->devname, mdfd,
rv = Manage_subdevs(ident.devname, mdfd,
devlist->next, c.verbose,
c.test, c.update, c.force);
if (!rv && c.readonly < 0)
rv = Manage_ro(devlist->devname, mdfd, c.readonly);
rv = Manage_ro(ident.devname, mdfd, c.readonly);
if (!rv && c.runstop > 0)
rv = Manage_run(devlist->devname, mdfd, &c);
rv = Manage_run(ident.devname, mdfd, &c);
if (!rv && c.runstop < 0)
rv = Manage_stop(devlist->devname, mdfd, c.verbose, 0);
rv = Manage_stop(ident.devname, mdfd, c.verbose, 0);
break;
case ASSEMBLE:
if (!c.scan && c.runstop == -1) {
@ -1428,22 +1418,19 @@ int main(int argc, char *argv[])
ident.super_minor == UnSet && ident.name[0] == 0 &&
!c.scan) {
/* Only a device has been given, so get details from config file */
struct mddev_ident *array_ident = conf_get_ident(devlist->devname);
struct mddev_ident *array_ident = conf_get_ident(ident.devname);
if (array_ident == NULL) {
pr_err("%s not identified in config file.\n",
devlist->devname);
pr_err("%s not identified in config file.\n", ident.devname);
rv |= 1;
if (mdfd >= 0)
close(mdfd);
} else {
if (array_ident->autof == 0)
array_ident->autof = c.autof;
rv |= Assemble(ss, devlist->devname, array_ident,
NULL, &c);
rv |= Assemble(ss, ident.devname, array_ident, NULL, &c);
}
} else if (!c.scan)
rv = Assemble(ss, devlist->devname, &ident,
devlist->next, &c);
rv = Assemble(ss, ident.devname, &ident, devlist->next, &c);
else if (devs_found > 0) {
if (c.update && devs_found > 1) {
pr_err("can only update a single array at a time\n");
@ -1501,7 +1488,7 @@ int main(int argc, char *argv[])
break;
}
}
rv = Build(devlist->devname, devlist->next, &s, &c);
rv = Build(&ident, devlist->next, &s, &c);
break;
case CREATE:
if (c.delay == 0)
@ -1538,9 +1525,7 @@ int main(int argc, char *argv[])
break;
}
rv = Create(ss, devlist->devname,
ident.name, ident.uuid_set ? ident.uuid : NULL,
devs_found - 1, devlist->next, &s, &c);
rv = Create(ss, &ident, devs_found - 1, devlist->next, &s, &c);
break;
case MISC:
if (devmode == 'E') {
@ -1637,8 +1622,7 @@ int main(int argc, char *argv[])
break;
}
for (dv = devlist->next; dv; dv = dv->next) {
rv = Grow_Add_device(devlist->devname, mdfd,
dv->devname);
rv = Grow_Add_device(ident.devname, mdfd, dv->devname);
if (rv)
break;
}
@ -1651,18 +1635,15 @@ int main(int argc, char *argv[])
}
if (c.delay == 0)
c.delay = DEFAULT_BITMAP_DELAY;
rv = Grow_addbitmap(devlist->devname, mdfd, &c, &s);
rv = Grow_addbitmap(ident.devname, mdfd, &c, &s);
} else if (grow_continue)
rv = Grow_continue_command(devlist->devname,
mdfd, c.backup_file,
c.verbose);
rv = Grow_continue_command(ident.devname, mdfd, c.backup_file, c.verbose);
else if (s.size > 0 || s.raiddisks || s.layout_str ||
s.chunk != 0 || s.level != UnSet ||
s.data_offset != INVALID_SECTORS) {
rv = Grow_reshape(devlist->devname, mdfd,
devlist->next, &c, &s);
rv = Grow_reshape(ident.devname, mdfd, devlist->next, &c, &s);
} else if (s.consistency_policy != CONSISTENCY_POLICY_UNKNOWN) {
rv = Grow_consistency_policy(devlist->devname, mdfd, &c, &s);
rv = Grow_consistency_policy(ident.devname, mdfd, &c, &s);
} else if (array_size == 0)
pr_err("no changes to --grow\n");
break;