The branch stable/13 has been updated by mav:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=e3b3dfa77964b235a768534c174a54df03080096

commit e3b3dfa77964b235a768534c174a54df03080096
Author:     Alexander Motin <[email protected]>
AuthorDate: 2022-03-08 18:44:22 +0000
Commit:     Alexander Motin <[email protected]>
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

Reply via email to