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
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to