diff -urN -X dontdiff linux/kernel/module.c 2327-p5-modlist/kernel/module.c
--- linux/kernel/module.c       Wed Nov 10 08:49:07 1999
+++ 2327-p5-modlist/kernel/module.c     Wed Nov 10 12:38:12 1999
@@ -133,7 +133,6 @@
       long namelen, error;
       struct module *mod;

-       write_lock(&modlist_lock);
       if (!capable(CAP_SYS_MODULE)) {
               error = -EPERM;
               goto err0;
@@ -155,6 +154,7 @@
               goto err1;
       }

+       write_lock(&modlist_lock);
       memset(mod, 0, sizeof(*mod));
       mod->size_of_struct = sizeof(*mod);
       mod->next = module_list;
@@ -165,13 +165,13 @@
       put_mod_name(name);

       module_list = mod;      /* link it in */
+       write_unlock(&modlist_lock);

       error = (long) mod;
       goto err0;
err1:
       put_mod_name(name);
err0:
-       write_unlock(&modlist_lock);
       return error;
}

@@ -188,7 +188,6 @@
       unsigned long mod_user_size;
       struct module_ref *dep;

-       write_lock(&modlist_lock);
       if (!capable(CAP_SYS_MODULE))
               goto err0;
       if ((namelen = get_mod_name(name_user, &name)) < 0) {
@@ -326,11 +325,13 @@
                       goto err3;
               }

+               read_lock(&modlist_lock);
               for (o = module_list; o != &kernel_module; o = o->next)
                       if (o == d) goto found_dep;

               printk(KERN_ERR "init_module: found dependency that is "
                               "(no longer?) a module.\n");
+               read_unlock(&modlist_lock);
               goto err3;

       found_dep:
@@ -340,6 +341,7 @@
               /* Being referenced by a dependent module counts as a
                  use as far as kmod is concerned.  */
               d->flags |= MOD_USED_ONCE;
+               read_unlock(&modlist_lock);
       }

       /* Free our temporary memory.  */
@@ -367,7 +369,6 @@
err1:
       put_mod_name(name);
err0:
-       write_unlock(&modlist_lock);
       return error;
}

@@ -379,7 +380,6 @@
       long error = -EPERM;
       int something_changed;

-       write_lock(&modlist_lock);
       if (!capable(CAP_SYS_MODULE))
               goto out;

@@ -401,13 +401,16 @@
               if (mod->refs != NULL || __MOD_IN_USE(mod))
                       goto out;

+               write_lock(&modlist_lock);
               free_module(mod, 0);
+               write_unlock(&modlist_lock);
               error = 0;
               goto out;
       }

       /* Do automatic reaping */
restart:
+       write_lock(&modlist_lock);
       something_changed = 0;
       for (mod = module_list; mod != &kernel_module; mod = next) {
               next = mod->next;
@@ -426,13 +429,13 @@
                       }
               }
       }
+       write_unlock(&modlist_lock);
       if (something_changed)
               goto restart;
       for (mod = module_list; mod != &kernel_module; mod = mod->next)
               mod->flags &= ~MOD_JUST_FREED;
       error = 0;
out:
-       write_unlock(&modlist_lock);
       return error;
}

@@ -451,10 +454,9 @@
               len = strlen(mod->name)+1;
               if (len > bufsize)
                       goto calc_space_needed;
-               if (copy_to_user(buf, mod->name, len)) {
-                       read_unlock(&modlist_lock);
+               read_unlock(&modlist_lock);
+               if (copy_to_user(buf, mod->name, len))
                       return -EFAULT;
-               }
               buf += len;
               bufsize -= len;
               space += len;
@@ -470,8 +472,8 @@
       space += len;
       while ((mod = mod->next) != &kernel_module)
               space += strlen(mod->name)+1;
-
       read_unlock(&modlist_lock);
+
       if (put_user(space, ret))
               return -EFAULT;
       else
@@ -658,7 +660,6 @@
       struct module *mod;
       int err;

-       read_lock(&modlist_lock);
       if (name_user == NULL)
               mod = &kernel_module;
       else {
@@ -704,7 +705,6 @@
               break;
       }
out:
-       read_unlock(&modlist_lock);
       return err;
}

@@ -772,7 +772,6 @@

/*
 * Look for a module by name, ignoring modules marked for deletion.
- * Callers must hold modlist_lock at least in read mode.
 */

static struct module *
@@ -780,12 +779,14 @@
{
       struct module *mod;

+       read_lock(&modlist_lock);
       for (mod = module_list; mod ; mod = mod->next) {
               if (mod->flags & MOD_DELETED)
                       continue;
               if (!strcmp(mod->name, name))
                       break;
       }
+       read_unlock(&modlist_lock);

       return mod;
}