Change locking requirements for VOP_UNSET_TEXT().

Require the vnode to be locked for the VOP_UNSET_TEXT() call.  This
will be used by the following bug fix for a tmpfs issue.

Tested by:	sbruno, pho (previous version)
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2019-08-18 20:24:52 +00:00
parent e7c1709aaf
commit bb9e2184f0
3 changed files with 18 additions and 5 deletions

View File

@ -472,8 +472,13 @@ cleanup:
locked = false;
VOP_CLOSE(vp, FREAD, td->td_ucred, td);
}
if (textset)
if (textset) {
if (!locked) {
locked = true;
VOP_LOCK(vp, LK_SHARED | LK_RETRY);
}
VOP_UNSET_TEXT_CHECKED(vp);
}
if (locked)
VOP_UNLOCK(vp, 0);

View File

@ -695,7 +695,7 @@ vop_set_text {
};
%% vop_unset_text vp = = =
%% vop_unset_text vp L L L
vop_unset_text {
IN struct vnode *vp;

View File

@ -547,12 +547,20 @@ vm_map_entry_set_vnode_text(vm_map_entry_t entry, bool add)
"entry %p, object %p, add %d", entry, object, add));
}
if (vp != NULL) {
if (add)
if (add) {
VOP_SET_TEXT_CHECKED(vp);
else
VM_OBJECT_RUNLOCK(object);
} else {
vhold(vp);
VM_OBJECT_RUNLOCK(object);
vn_lock(vp, LK_SHARED | LK_RETRY);
VOP_UNSET_TEXT_CHECKED(vp);
VOP_UNLOCK(vp, 0);
vdrop(vp);
}
} else {
VM_OBJECT_RUNLOCK(object);
}
VM_OBJECT_RUNLOCK(object);
}
static void