mirror of
https://github.com/opnsense/src.git
synced 2026-06-06 15:22:34 -04:00
uipc_bindat(): Explicitly specify exclusive locking for the new vnode
When calling VOP_CREATE(), uipc_bindat() reuses the componentname object from the preceding lookup operation, which is likely to specify LK_SHARED. Furthermore, the VOP_CREATE() interface technically only requires the newly-created vnode to be returned with a shared lock. However, the socket layer requires the new vnode to be locked exclusive and asserts to that effect. In most cases, this is not a practical concern because most if not all base-layer filesystems (certainly FFS, ZFS, and msdosfs at least) always return the vnode locked exclusive regardless of the lock flags. However, it is an issue for unionfs which uses cn_lkflags to determine how the new unionfs wrapper vnode should be locked. While it would be easy enough to work around this issue within unionfs itself, it seems better for the socket layer to be explicit about its locking requirements when issuing VOP_CREATE(). Reviewed by: kib, olce MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D44047
This commit is contained in:
parent
fa26f46dc2
commit
d56c175ac9
1 changed files with 12 additions and 1 deletions
|
|
@ -594,8 +594,19 @@ restart:
|
|||
error = mac_vnode_check_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
|
||||
&vattr);
|
||||
#endif
|
||||
if (error == 0)
|
||||
if (error == 0) {
|
||||
/*
|
||||
* The prior lookup may have left LK_SHARED in cn_lkflags,
|
||||
* and VOP_CREATE technically only requires the new vnode to
|
||||
* be locked shared. Most filesystems will return the new vnode
|
||||
* locked exclusive regardless, but we should explicitly
|
||||
* specify that here since we require it and assert to that
|
||||
* effect below.
|
||||
*/
|
||||
nd.ni_cnd.cn_lkflags = (nd.ni_cnd.cn_lkflags & ~LK_SHARED) |
|
||||
LK_EXCLUSIVE;
|
||||
error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);
|
||||
}
|
||||
NDFREE_PNBUF(&nd);
|
||||
if (error) {
|
||||
VOP_VPUT_PAIR(nd.ni_dvp, NULL, true);
|
||||
|
|
|
|||
Loading…
Reference in a new issue