Re: [PATCH 2/2] modprobe: handle built-in modules (v2)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 9/10/09, Michal Marek <mmarek@xxxxxxx> wrote:
> The kernel installs a modules.builtin file listing all builtin
> modules. Let depmod generate a modules.builtin.bin file and use
> this in modprobe: If a module is not found in modules.dep or
> modules.alias, check if the module is builtin and either do nothing,
> or print "builtin <module>" if --show-depends was given.
>
> Signed-off-by: Michal Marek <mmarek@xxxxxxx>
> ---
>  depmod.c   |   46 +++++++++++++++++++++++++++++++++++++++++++++-
>  modprobe.c |   31 +++++++++++++++++++++++++++++++
>  2 files changed, 76 insertions(+), 1 deletions(-)
>
> diff --git a/depmod.c b/depmod.c
> index 3ac5070..43ff28f 100644
> --- a/depmod.c
> +++ b/depmod.c
> @@ -825,6 +825,49 @@ static int output_symbols_bin(struct module *unused,
> FILE *out, char *dirname)
>  	return 1;
>  }
>
> +static int output_builtin_bin(struct module *unused, FILE *out, char
> *dirname)
> +{
> +	struct index_node *index;
> +	char *textfile, *line;
> +	unsigned int linenum;
> +	FILE *f;
> +
> +	nofail_asprintf(&textfile, "%s/modules.builtin", dirname);
> +	if (!(f = fopen(textfile, "r"))) {
> +		if (errno != ENOENT)
> +			fatal("Could not open '%s': %s\n",
> +					textfile, strerror(errno));
> +		free(textfile);
> +		return 0;
> +	}
> +	free(textfile);
> +	index = index_create();
> +
> +	while ((line = getline_wrapped(f, &linenum)) != NULL) {
> +		char *module = strrchr(line, '/');
> +
> +		if (!*line || *line == '#') {
> +			free(line);
> +			continue;
> +		}

> +		module = strrchr(line, '/');

this duplicates the assignment in the declaration of module.  But I
wonder why this whole chunk of code is needed...

> +		if (module)
> +			module++;
> +		else
> +			module = line;
> +		if (ends_in(module, ".ko"))
> +			module[strlen(module) - 3] = '\0';
> +		underscores(module);

...because we already have filename2modname().  I think you can just
do filename2modname(module, module).

> +		index_insert(index, module, "", 0);
> +		free(line);
> +	}
> +	fclose(f);
> +	index_write(index, out);
> +	index_destroy(index);
> +
> +	return 1;
> +}
> +
>  static int output_aliases(struct module *modules, FILE *out, char *dirname)
>  {
>  	struct module *i;

> @@ -1331,6 +1349,19 @@ int do_modprobe(char *modname,
>  					  modname, 0, flags & mit_remove,
>  					  &modoptions, &commands,
>  					  &aliases, &blacklist);
> +			/* builtin module? */
> +			if (!aliases && !(flags & mit_remove) &&
> +			    module_builtin(dirname, modname) == 1) {
> +				if (flags & mit_first_time) {
> +					error("Module %s already in kernel (builtin).\n",
> +					      modname);
> +					return 1;
> +				} else if (flags & mit_ignore_loaded) {
> +					/* --show-depends given */
> +					info("builtin %s\n", modname);
> +				}
> +				return 0;
> +			}

Better.

Let's see, if mit_remove is set, we treat it as a normal module, find
that it is not present, and return success.  "modprobe -r --first-time
$builtin-module" will fail as expected... but the error message will
be wrong

"FATAL: Module $builtin-module is not in kernel."

How about this (not tested, may exceed 80 cols):

			if (!aliases &&
			    module_builtin(dirname, modname) == 1) {
				if (flags & mit_remove) {
					if (flags & mit_first_time)
						error("Module %s is builtin\n", modname);
					return 1;
				} else if (flags & mit_first_time) {
					error("Module %s already in kernel (builtin).\n",
					      modname);
					return 1;
				} else if (flags & mit_ignore_loaded) {
					/* --show-depends given */
					info("builtin %s\n", modname);
				}
				return 0;
			}

Regards
Alan
--
To unsubscribe from this list: send the line "unsubscribe linux-modules" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux