svn commit: r351474 - in stable/12/sys: compat/linux kern vm

Konstantin Belousov kib at FreeBSD.org
Sun Aug 25 06:19:53 UTC 2019


Author: kib
Date: Sun Aug 25 06:19:51 2019
New Revision: 351474
URL: https://svnweb.freebsd.org/changeset/base/351474

Log:
  MFC r351194:
  Change locking requirements for VOP_UNSET_TEXT().

Modified:
  stable/12/sys/compat/linux/linux_misc.c
  stable/12/sys/kern/vnode_if.src
  stable/12/sys/vm/vm_map.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/compat/linux/linux_misc.c
==============================================================================
--- stable/12/sys/compat/linux/linux_misc.c	Sun Aug 25 06:14:00 2019	(r351473)
+++ stable/12/sys/compat/linux/linux_misc.c	Sun Aug 25 06:19:51 2019	(r351474)
@@ -494,8 +494,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);
 

Modified: stable/12/sys/kern/vnode_if.src
==============================================================================
--- stable/12/sys/kern/vnode_if.src	Sun Aug 25 06:14:00 2019	(r351473)
+++ stable/12/sys/kern/vnode_if.src	Sun Aug 25 06:19:51 2019	(r351474)
@@ -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;

Modified: stable/12/sys/vm/vm_map.c
==============================================================================
--- stable/12/sys/vm/vm_map.c	Sun Aug 25 06:14:00 2019	(r351473)
+++ stable/12/sys/vm/vm_map.c	Sun Aug 25 06:19:51 2019	(r351474)
@@ -546,12 +546,20 @@ vm_map_entry_set_vnode_text(vm_map_entry_t entry, bool
 		    "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


More information about the svn-src-all mailing list