On 11/26/25 7:42 AM, Fabian Pflug wrote:
> Getting root device adn root kernel options seperatily any combining

device and root kernel options seperatly and combining

> them in this function instead of getting the full string from the helper
> functions. This is in preperation for replacing the root= string in the

preparation

> kernel commandline with something defined during runtime.
> 
> Signed-off-by: Fabian Pflug <[email protected]>
> ---
>  common/bootm.c | 34 ++++++++++++++++++++--------------
>  1 file changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/common/bootm.c b/common/bootm.c
> index 17792b2a1d..5d7dc00e3e 100644
> --- a/common/bootm.c
> +++ b/common/bootm.c
> @@ -4,6 +4,7 @@
>  #include <bootm.h>
>  #include <bootm-overrides.h>
>  #include <fs.h>
> +#include <fcntl.h>
>  #include <malloc.h>
>  #include <memory.h>
>  #include <block.h>
> @@ -841,33 +842,38 @@ int bootm_boot(struct bootm_data *bootm_data)
>       }
>  
>       if (bootm_data->appendroot) {
> -             char *rootarg;
> +             char *root;
> +             char *rootopts;
>  
>               if (bootm_data->root_dev) {
>                       const char *root_dev_name = 
> devpath_to_name(bootm_data->root_dev);
>                       struct cdev *root_cdev = 
> cdev_open_by_name(root_dev_name, O_RDONLY);
>  
> -                     rootarg = cdev_get_linux_rootarg(root_cdev);
> -                     if (!rootarg) {
> -                             rootarg = ERR_PTR(-EINVAL);
> -
> -                             if (!root_cdev)
> -                                     pr_err("no cdev found for %s, cannot 
> set root= option\n",
> -                                             root_dev_name);
> -                             else if (!root_cdev->partuuid[0])
> -                                     pr_err("%s doesn't have a PARTUUID, 
> cannot set root= option\n",
> -                                             root_dev_name);

This warning is useful, because it's very confusing otherwise when a MBR
disk image is created without a NT signature.

> -                     }
> +                     cdev_get_linux_root_and_opts(root_cdev, &root, 
> &rootopts);
>  
>                       if (root_cdev)
>                               cdev_close(root_cdev);
> +                     else
> +                             pr_err("no cdev found for %s, cannot set root= 
> option\n", root_dev_name);
>               } else {
> -                     rootarg = path_get_linux_rootarg(data->os_file);

path_get_linux_rootarg() is stale now right? Can you squash its removal
into the patch that gets rid of linux.bootargs?

> +                     struct fs_device *fsdev = 
> get_fsdevice_by_path(AT_FDCWD, data->os_file);
> +                     if(fsdev)
> +                             fsdev_get_linux_root_options(fsdev, &root, 
> &rootopts);
> +                     else
> +                             pr_err("no fsdevice under path: %s\n", 
> data->os_file);
>               }
>  
> -             if (IS_ERR(rootarg)) {
> +             if (!root) {
>                       pr_err("Failed to append kernel cmdline parameter 
> 'root='\n");
>               } else {
> +                     char *rootarg;
> +                     if(rootopts) {
> +                             rootarg = xasprintf("root=%s %s", root, 
> rootopts);
> +                             free(rootopts);
> +                     } else {
> +                             rootarg = xasprintf("root=%s", root);
> +                     }

I wonder if we should add a helper into a header that does this, given
how many times this is repeated...

char *format_root_bootarg(char *root, char *rootopts);

which consumes (and frees) two pointers and returns a new buffer..

Cheers,
Ahmad

> +                     free(root);
>                       pr_info("Adding \"%s\" to Kernel commandline\n", 
> rootarg);
>                       globalvar_add_simple("linux.bootargs.bootm.appendroot",
>                                            rootarg);

-- 
Pengutronix e.K.                  |                             |
Steuerwalder Str. 21              | http://www.pengutronix.de/  |
31137 Hildesheim, Germany         | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686  | Fax:   +49-5121-206917-5555 |


Reply via email to