PERFORCE change 94079 for review
John Baldwin
jhb at FreeBSD.org
Sun Mar 26 19:17:44 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=94079
Change 94079 by jhb at jhb_zion on 2006/03/26 19:17:37
Simple Giant pushdown.
Affected files ...
.. //depot/projects/smpng/sys/kern/kern_linker.c#42 edit
Differences ...
==== //depot/projects/smpng/sys/kern/kern_linker.c#42 (text+ko) ====
@@ -758,13 +758,11 @@
td->td_retval[0] = -1;
- mtx_lock(&Giant);
-
if ((error = securelevel_gt(td->td_ucred, 0)) != 0)
- goto out;
+ return (error);
if ((error = suser(td)) != 0)
- goto out;
+ return (error);
pathname = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
if ((error = copyinstr(uap->file, pathname, MAXPATHLEN, NULL)) != 0)
@@ -782,16 +780,16 @@
kldname = NULL;
modname = pathname;
}
+
+ mtx_lock(&Giant);
error = linker_load_module(kldname, modname, NULL, NULL, &lf);
- if (error)
- goto out;
-
- lf->userrefs++;
- td->td_retval[0] = lf->id;
+ if (error == 0) {
+ lf->userrefs++;
+ td->td_retval[0] = lf->id;
+ }
+ mtx_unlock(&Giant);
out:
- if (pathname)
- free(pathname, M_TEMP);
- mtx_unlock(&Giant);
+ free(pathname, M_TEMP);
return (error);
}
@@ -804,14 +802,13 @@
linker_file_t lf;
int error = 0;
- mtx_lock(&Giant);
-
if ((error = securelevel_gt(td->td_ucred, 0)) != 0)
- goto out;
+ return (error);
if ((error = suser(td)) != 0)
- goto out;
+ return (error);
+ mtx_lock(&Giant);
lf = linker_find_file_by_id(fileid);
if (lf) {
KLD_DPF(FILE, ("kldunload: lf->userrefs=%d\n", lf->userrefs));
@@ -822,15 +819,14 @@
printf("kldunload: attempt to unload file that was"
" loaded by the kernel\n");
error = EBUSY;
- goto out;
+ } else {
+ lf->userrefs--;
+ error = linker_file_unload(lf, flags);
+ if (error)
+ lf->userrefs++;
}
- lf->userrefs--;
- error = linker_file_unload(lf, flags);
- if (error)
- lf->userrefs++;
} else
error = ENOENT;
-out:
mtx_unlock(&Giant);
return (error);
}
@@ -875,7 +871,6 @@
return (error);
#endif
- mtx_lock(&Giant);
td->td_retval[0] = -1;
pathname = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
@@ -883,15 +878,15 @@
goto out;
filename = linker_basename(pathname);
+ mtx_lock(&Giant);
lf = linker_find_file_by_name(filename);
+ mtx_unlock(&Giant);
if (lf)
td->td_retval[0] = lf->id;
else
error = ENOENT;
out:
- if (pathname)
- free(pathname, M_TEMP);
- mtx_unlock(&Giant);
+ free(pathname, M_TEMP);
return (error);
}
@@ -1041,22 +1036,20 @@
return (error);
#endif
- mtx_lock(&Giant);
-
if ((error = copyin(uap->data, &lookup, sizeof(lookup))) != 0)
- goto out;
+ return (error);
if (lookup.version != sizeof(lookup) ||
- uap->cmd != KLDSYM_LOOKUP) {
- error = EINVAL;
- goto out;
- }
+ uap->cmd != KLDSYM_LOOKUP)
+ return (EINVAL);
symstr = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
if ((error = copyinstr(lookup.symname, symstr, MAXPATHLEN, NULL)) != 0)
goto out;
+ mtx_lock(&Giant);
if (uap->fileid != 0) {
lf = linker_find_file_by_id(uap->fileid);
if (lf == NULL) {
error = ENOENT;
+ mtx_unlock(&Giant);
goto out;
}
if (LINKER_LOOKUP_SYMBOL(lf, symstr, &sym) == 0 &&
@@ -1082,10 +1075,9 @@
if (lf == NULL)
error = ENOENT;
}
+ mtx_unlock(&Giant);
out:
- if (symstr)
- free(symstr, M_TEMP);
- mtx_unlock(&Giant);
+ free(symstr, M_TEMP);
return (error);
}
More information about the p4-projects
mailing list