git: e3b3dfa77964 - stable/13 - gpart: Avoid geom_gettree() call in "bootcode -b".
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 06 Apr 2022 02:45:22 UTC
The branch stable/13 has been updated by mav:
URL: https://cgit.FreeBSD.org/src/commit/?id=e3b3dfa77964b235a768534c174a54df03080096
commit e3b3dfa77964b235a768534c174a54df03080096
Author: Alexander Motin <mav@FreeBSD.org>
AuthorDate: 2022-03-08 18:44:22 +0000
Commit: Alexander Motin <mav@FreeBSD.org>
CommitDate: 2022-04-06 02:07:40 +0000
gpart: Avoid geom_gettree() call in "bootcode -b".
geom_gettree() may be pretty expensive on large systems, and it is
not needed if only -b flag specified, that is processed by kernel.
MFC after: 1 month
(cherry picked from commit 5c20bfc78706d2fe6e262ddb55af0a8b928d3835)
---
lib/geom/part/geom_part.c | 45 +++++++++++++++++++++++----------------------
1 file changed, 23 insertions(+), 22 deletions(-)
diff --git a/lib/geom/part/geom_part.c b/lib/geom/part/geom_part.c
index 41131646e246..330a4708251d 100644
--- a/lib/geom/part/geom_part.c
+++ b/lib/geom/part/geom_part.c
@@ -1217,6 +1217,14 @@ gpart_bootcode(struct gctl_req *req, unsigned int fl)
} else
bootcode = NULL;
+ if (!gctl_has_param(req, GPART_PARAM_PARTCODE)) {
+ if (bootcode == NULL)
+ errx(EXIT_FAILURE, "neither -b nor -p specified");
+ if (gctl_has_param(req, GPART_PARAM_INDEX))
+ errx(EXIT_FAILURE, "-i is only valid with -p");
+ goto nopartcode;
+ }
+
s = gctl_get_ascii(req, "class");
if (s == NULL)
abort();
@@ -1244,22 +1252,7 @@ gpart_bootcode(struct gctl_req *req, unsigned int fl)
else
vtoc8 = 0;
- if (gctl_has_param(req, GPART_PARAM_PARTCODE)) {
- s = gctl_get_ascii(req, GPART_PARAM_PARTCODE);
- if (vtoc8 != 0)
- partsize = VTOC_BOOTSIZE;
- else
- partsize = 1024 * 1024; /* Arbitrary limit. */
- partcode = gpart_bootfile_read(s, &partsize);
- error = gctl_delete_param(req, GPART_PARAM_PARTCODE);
- if (error)
- errc(EXIT_FAILURE, error, "internal error");
- } else
- partcode = NULL;
-
if (gctl_has_param(req, GPART_PARAM_INDEX)) {
- if (partcode == NULL)
- errx(EXIT_FAILURE, "-i is only valid with -p");
idx = (int)gctl_get_intmax(req, GPART_PARAM_INDEX);
if (idx < 1)
errx(EXIT_FAILURE, "invalid partition index");
@@ -1269,7 +1262,16 @@ gpart_bootcode(struct gctl_req *req, unsigned int fl)
} else
idx = 0;
- if (partcode != NULL) {
+ if (gctl_has_param(req, GPART_PARAM_PARTCODE)) {
+ s = gctl_get_ascii(req, GPART_PARAM_PARTCODE);
+ if (vtoc8 != 0)
+ partsize = VTOC_BOOTSIZE;
+ else
+ partsize = 1024 * 1024; /* Arbitrary limit. */
+ partcode = gpart_bootfile_read(s, &partsize);
+ error = gctl_delete_param(req, GPART_PARAM_PARTCODE);
+ if (error)
+ errc(EXIT_FAILURE, error, "internal error");
if (vtoc8 == 0) {
if (idx == 0)
errx(EXIT_FAILURE, "missing -i option");
@@ -1279,15 +1281,14 @@ gpart_bootcode(struct gctl_req *req, unsigned int fl)
errx(EXIT_FAILURE, "invalid bootcode");
gpart_write_partcode_vtoc8(gp, idx, partcode);
}
- } else
- if (bootcode == NULL)
- errx(EXIT_FAILURE, "no -b nor -p");
+ free(partcode);
+ }
+ geom_deletetree(&mesh);
+
+nopartcode:
if (bootcode != NULL)
gpart_issue(req, fl);
-
- geom_deletetree(&mesh);
- free(partcode);
}
static void