- Remove Giant acquisition from modevent(), modfnext(), modstat() and

modfind().  Giant is no longer needed by these functions for safe
  execution.

Reviewed by:	jhb
This commit is contained in:
Andrew R. Reiter 2002-06-26 00:31:44 +00:00
parent 085b9f3eb2
commit e024f583de

View File

@ -256,9 +256,8 @@ modnext(struct thread *td, struct modnext_args *uap)
module_t mod; module_t mod;
int error = 0; int error = 0;
mtx_lock(&Giant);
td->td_retval[0] = -1; td->td_retval[0] = -1;
MOD_SLOCK; MOD_SLOCK;
if (SCARG(uap, modid) == 0) { if (SCARG(uap, modid) == 0) {
mod = TAILQ_FIRST(&modules); mod = TAILQ_FIRST(&modules);
@ -279,7 +278,6 @@ modnext(struct thread *td, struct modnext_args *uap)
td->td_retval[0] = 0; td->td_retval[0] = 0;
done2: done2:
MOD_SUNLOCK; MOD_SUNLOCK;
mtx_unlock(&Giant);
return (error); return (error);
} }
@ -294,8 +292,6 @@ modfnext(struct thread *td, struct modfnext_args *uap)
td->td_retval[0] = -1; td->td_retval[0] = -1;
mtx_lock(&Giant);
MOD_SLOCK; MOD_SLOCK;
mod = module_lookupbyid(SCARG(uap, modid)); mod = module_lookupbyid(SCARG(uap, modid));
if (mod == NULL) { if (mod == NULL) {
@ -308,7 +304,6 @@ modfnext(struct thread *td, struct modfnext_args *uap)
td->td_retval[0] = 0; td->td_retval[0] = 0;
} }
MOD_SUNLOCK; MOD_SUNLOCK;
mtx_unlock(&Giant);
return (error); return (error);
} }
@ -332,14 +327,11 @@ modstat(struct thread *td, struct modstat_args *uap)
struct module_stat *stat; struct module_stat *stat;
char *name; char *name;
mtx_lock(&Giant);
MOD_SLOCK; MOD_SLOCK;
mod = module_lookupbyid(SCARG(uap, modid)); mod = module_lookupbyid(SCARG(uap, modid));
if (mod == NULL) { if (mod == NULL) {
MOD_SUNLOCK; MOD_SUNLOCK;
error = ENOENT; return (ENOENT);
goto out;
} }
id = mod->id; id = mod->id;
refs = mod->refs; refs = mod->refs;
@ -352,34 +344,29 @@ modstat(struct thread *td, struct modstat_args *uap)
* Check the version of the user's structure. * Check the version of the user's structure.
*/ */
if ((error = copyin(&stat->version, &version, sizeof(version))) != 0) if ((error = copyin(&stat->version, &version, sizeof(version))) != 0)
goto out; return (error);
if (version != sizeof(struct module_stat_v1) if (version != sizeof(struct module_stat_v1)
&& version != sizeof(struct module_stat)) { && version != sizeof(struct module_stat))
error = EINVAL; return (EINVAL);
goto out;
}
namelen = strlen(mod->name) + 1; namelen = strlen(mod->name) + 1;
if (namelen > MAXMODNAME) if (namelen > MAXMODNAME)
namelen = MAXMODNAME; namelen = MAXMODNAME;
if ((error = copyout(name, &stat->name[0], namelen)) != 0) if ((error = copyout(name, &stat->name[0], namelen)) != 0)
goto out; return (error);
if ((error = copyout(&refs, &stat->refs, sizeof(int))) != 0) if ((error = copyout(&refs, &stat->refs, sizeof(int))) != 0)
goto out; return (error);
if ((error = copyout(&id, &stat->id, sizeof(int))) != 0) if ((error = copyout(&id, &stat->id, sizeof(int))) != 0)
goto out; return (error);
/* /*
* >v1 stat includes module data. * >v1 stat includes module data.
*/ */
if (version == sizeof(struct module_stat)) { if (version == sizeof(struct module_stat))
if ((error = copyout(&data, &stat->data, if ((error = copyout(&data, &stat->data,
sizeof(data))) != 0) sizeof(data))) != 0)
goto out; return (error);
}
td->td_retval[0] = 0; td->td_retval[0] = 0;
out:
mtx_unlock(&Giant);
return (error); return (error);
} }
@ -394,9 +381,8 @@ modfind(struct thread *td, struct modfind_args *uap)
module_t mod; module_t mod;
if ((error = copyinstr(SCARG(uap, name), name, sizeof name, 0)) != 0) if ((error = copyinstr(SCARG(uap, name), name, sizeof name, 0)) != 0)
goto out; return (error);
mtx_lock(&Giant);
MOD_SLOCK; MOD_SLOCK;
mod = module_lookupbyname(name); mod = module_lookupbyname(name);
if (mod == NULL) if (mod == NULL)
@ -404,7 +390,5 @@ modfind(struct thread *td, struct modfind_args *uap)
else else
td->td_retval[0] = module_getid(mod); td->td_retval[0] = module_getid(mod);
MOD_SUNLOCK; MOD_SUNLOCK;
mtx_unlock(&Giant);
out:
return (error); return (error);
} }