how to override kernel modules? (patch)

Fernando Pablo Lopez-Lezcano nando at ccrma.Stanford.EDU
Mon Jun 14 20:22:30 UTC 2004


On Mon, 2004-06-14 at 11:12, Fernando Pablo Lopez-Lezcano wrote:
> On Sun, 2004-06-13 at 19:03, Fernando Pablo Lopez-Lezcano wrote:
> > On Fri, 2004-06-11 at 12:50, Fernando Pablo Lopez-Lezcano wrote:
> > > >From what I have read in the list, FC >= 1 has a /lib/modules/`uname
> > > -r`/updates directory where kernel modules could be dropped to override
> > > modules that are included in the standard kernel. 
> > > 
> > > Apparently that is not happening. The kernel modules in the "updates"
> > > directory are always showing up in modules.dep _after_ the kernel
> > > modules in the main tree. 
> > > 
> > > Anything I need to do to change this?
> > 
> > I did some more code reading and apparently you can't override a kernel
> > module with another module of the same name _reliably_. 
> > [MUNCH]
> > I hope I'm wrong and there's something I did miss. 
> 
> Apparently not. 
> 
> > If my assesment is
> > correct, I'm left with  not options for upgrading the ALSA subsystem
> > independently of the kernel itself. Arghhhh...
> 
> The only one I can think of would be to patch modutils. 

One simple patch attached (just tested it, seems to work) that uses
scandir to reverse-order the directory entries so that, for example,
"_updates/" is scanned first and modules stored there override modules
of the same name that come with the kernel package. 

-- Fernando

-------------- next part --------------
--- modutils-2.4.26/module-init-tools-3.0-pre10/depmod.c~	2004-01-22 17:28:17.000000000 -0800
+++ modutils-2.4.26/module-init-tools-3.0-pre10/depmod.c	2004-06-14 13:16:12.637390616 -0700
@@ -464,34 +464,35 @@
 
 static struct module *grab_dir(const char *dirname, struct module *next)
 {
-	DIR *dir;
-	struct dirent *dirent;
+    int n, i;
+	struct dirent **namelist;
 
-	dir = opendir(dirname);
-	if (!dir) {
-		warn("Couldn't open directory %s: %s\n",
-		     dirname, strerror(errno));
-		return next;
+	n = scandir(dirname, &namelist, NULL, alphasort);
+	if (n < 0) {
+	    warn("Couldn't scan directory %s: %s\n",
+		 dirname, strerror(errno));
+	    return next;
 	}
 
-	while ((dirent = readdir(dir)) != NULL) {
-		if (smells_like_module(dirent->d_name))
-			next = grab_module(dirname, dirent->d_name, next);
-		else if (!streq(dirent->d_name, ".")
-			 && !streq(dirent->d_name, "..")) {
+        while (n--) {
+		if (smells_like_module(namelist[n]->d_name))
+			next = grab_module(dirname, namelist[n]->d_name, next);
+		else if (!streq(namelist[n]->d_name, ".")
+			 && !streq(namelist[n]->d_name, "..")) {
 			struct stat st;
 
 			char subdir[strlen(dirname) + 1
-				   + strlen(dirent->d_name) + 1];
-			sprintf(subdir, "%s/%s", dirname, dirent->d_name);
+				   + strlen(namelist[n]->d_name) + 1];
+			sprintf(subdir, "%s/%s", dirname, namelist[n]->d_name);
 			if (lstat(subdir, &st) != 0)
 				warn("Couldn't stat %s: %s\n", subdir,
 				     strerror(errno));
 			else if (S_ISDIR(st.st_mode))
 				next = grab_dir(subdir, next);
 		}
+		free(namelist[n]);
 	}
-	closedir(dir);
+	free(namelist);
 	return next;
 }
 


More information about the fedora-devel-list mailing list