svn commit: r213359 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Sat Oct 2 16:04:51 UTC 2010
Author: kib
Date: Sat Oct 2 16:04:50 2010
New Revision: 213359
URL: http://svn.freebsd.org/changeset/base/213359
Log:
Release the vnode lock and close the linker file vnode earlier in
the linker_load_file methods. The change is that the consequent
linker_file_unload() call is not under the vnode lock anymore.
This prevents the LOR between kernel linker sx xlock and vnode lock,
because linker_file_unload() relocks kernel linker lock.
MFC after: 2 weeks
Modified:
head/sys/kern/link_elf.c
head/sys/kern/link_elf_obj.c
Modified: head/sys/kern/link_elf.c
==============================================================================
--- head/sys/kern/link_elf.c Sat Oct 2 11:45:18 2010 (r213358)
+++ head/sys/kern/link_elf.c Sat Oct 2 16:04:50 2010 (r213359)
@@ -967,15 +967,15 @@ nosyms:
*result = lf;
out:
+ VOP_UNLOCK(nd.ni_vp, 0);
+ vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
+ VFS_UNLOCK_GIANT(vfslocked);
if (error && lf)
linker_file_unload(lf, LINKER_UNLOAD_FORCE);
if (shdr)
free(shdr, M_LINKER);
if (firstpage)
free(firstpage, M_LINKER);
- VOP_UNLOCK(nd.ni_vp, 0);
- vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
- VFS_UNLOCK_GIANT(vfslocked);
return error;
}
Modified: head/sys/kern/link_elf_obj.c
==============================================================================
--- head/sys/kern/link_elf_obj.c Sat Oct 2 11:45:18 2010 (r213358)
+++ head/sys/kern/link_elf_obj.c Sat Oct 2 16:04:50 2010 (r213359)
@@ -885,13 +885,13 @@ link_elf_load_file(linker_class_t cls, c
*result = lf;
out:
+ VOP_UNLOCK(nd.ni_vp, 0);
+ vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
+ VFS_UNLOCK_GIANT(vfslocked);
if (error && lf)
linker_file_unload(lf, LINKER_UNLOAD_FORCE);
if (hdr)
free(hdr, M_LINKER);
- VOP_UNLOCK(nd.ni_vp, 0);
- vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
- VFS_UNLOCK_GIANT(vfslocked);
return error;
}
More information about the svn-src-head
mailing list