mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-29 08:08:37 +00:00
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
This commit is contained in:
parent
fec07a7df1
commit
f1d2d3052a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=213359
@ -967,15 +967,15 @@ link_elf_load_file(linker_class_t cls, const char* filename,
|
||||
*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;
|
||||
}
|
||||
|
@ -885,13 +885,13 @@ link_elf_load_file(linker_class_t cls, const char *filename,
|
||||
*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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user