Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Mar 1997 17:53:14 -0600 (CST)
From:      mks@msc.edu
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/2864: Using modload with -p option
Message-ID:  <199703032353.RAA00607@salo.msci.magic.net>
Resent-Message-ID: <199703040000.QAA07556@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         2864
>Category:       bin
>Synopsis:       Using modload with -p option broken
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Mar  3 16:00:01 PST 1997
>Last-Modified:
>Originator:     Mike Spengler
>Organization:
Minnesota Supercomputer Center, Inc.
>Release:        FreeBSD 2.1-STABLE i386
>Environment:

>Description:

	There are two problems when using modload -p <post-install>:

	1. If the -u option is also specified, the loaded output file is
	   never deleted;

	2. The /dev/lkm device isn't closed before calling the post-install
	   program, thus modload still holds the exclusive lock on /dev/lkm.
	   If the post-install program then tries to use modstat (to figure
           out name of loaded module) it will hang on its open(/dev/lkm) and
	   thus the modload itself will hang waiting for the install program
	   to complete.

>How-To-Repeat:

	o create the following shell script (call it mod_loaded)
		#!/bin/sh
		#
		PATH=/bin:/sbin:/usr/bin:/usr/sbin; export PATH
		MODID=$1
		MOD=`modstat -i ${MODID} | awk '
        		$2 == modid {
                		print $NF;
                		exit;
        		}' modid=${MODID}`
		echo "module loaded was ${MOD}"
		exit 0

	o pick your favorite loadable module (mymod) and,

		modload -u -e <whatever> -o /tmp/mymod -p mod_loaded mymod.o

	o this should hang the modload and its invocation of mod_loaded and
	  will also not delete /tmp/mymod.


>Fix:
--- modload.c.orig      Tue May 30 01:09:20 1995
+++ modload.c   Mon Mar  3 17:03:40 1997
@@ -358,6 +358,12 @@
        fileopen &= ~PART_RESRV;        /* loaded */
        if(!quiet) printf("Module loaded as ID %d\n", resrv.slot);
 
+       if(dounlink) {
+               if(unlink(out)) {
+                       err(17, "unlink(%s)", out);
+               }
+       }
+
        if (post) {
            struct lmc_stat sbuf;
            char id[16], type[16], offset[16];
@@ -370,14 +376,12 @@
            sprintf(offset, "%d", sbuf.offset);
            /* XXX the modload docs say that drivers can install bdevsw &
               cdevsw, but the interface only supports one at a time.  sigh. */
+
+           /* Free resources before calling post-install program */
+           cleanup();
+
            execl(post, post, id, type, offset, 0);
            err(16, "can't exec '%s'", post);
-       }
-
-       if(dounlink) {
-               if(unlink(out)) {
-                       err(17, "unlink(%s)", out);
-               }
        }
 
        return 0;
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199703032353.RAA00607>