git: a6144f713cee - main - ktrace: do not stop tracing other processes if our cannot write to this vnode

Konstantin Belousov kib at FreeBSD.org
Sat May 22 12:16:56 UTC 2021


The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=a6144f713cee8f522150b1398b225eedbf4cfef1

commit a6144f713cee8f522150b1398b225eedbf4cfef1
Author:     Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-05-15 00:10:05 +0000
Commit:     Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-05-22 12:16:08 +0000

    ktrace: do not stop tracing other processes if our cannot write to this vnode
    
    Other processes might still be able to write, make the decision to stop
    based on the per-process situation.
    
    Reviewed by:    markj
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D30257
---
 sys/kern/kern_ktrace.c | 53 ++++++++++++++++++--------------------------------
 1 file changed, 19 insertions(+), 34 deletions(-)

diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 8728801acdf7..9916022961e9 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -1190,7 +1190,7 @@ ktr_writerequest(struct thread *td, struct ktr_request *req)
 	struct uio auio;
 	struct iovec aiov[3];
 	struct mount *mp;
-	int datalen, buflen, vrele_count;
+	int datalen, buflen;
 	int error;
 
 	/*
@@ -1264,44 +1264,29 @@ ktr_writerequest(struct thread *td, struct ktr_request *req)
 	}
 
 	/*
-	 * If error encountered, give up tracing on this vnode.  We defer
-	 * all the vrele()'s on the vnode until after we are finished walking
-	 * the various lists to avoid needlessly holding locks.
-	 * NB: at this point we still hold the vnode reference that must
-	 * not go away as we need the valid vnode to compare with. Thus let
-	 * vrele_count start at 1 and the reference will be freed
-	 * by the loop at the end after our last use of vp.
-	 */
-	log(LOG_NOTICE, "ktrace write failed, errno %d, tracing stopped\n",
-	    error);
-	vrele_count = 1;
-	/*
-	 * First, clear this vnode from being used by any processes in the
-	 * system.
-	 * XXX - If one process gets an EPERM writing to the vnode, should
-	 * we really do this?  Other processes might have suitable
-	 * credentials for the operation.
+	 * If error encountered, give up tracing on this vnode on this
+	 * process.  Other processes might still be suitable for
+	 * writes to this vnode.
 	 */
+	p = td->td_proc;
+	log(LOG_NOTICE,
+	    "ktrace write failed, errno %d, tracing stopped for pid %d\n",
+	    error, p->p_pid);
 	cred = NULL;
 	sx_slock(&allproc_lock);
-	FOREACH_PROC_IN_SYSTEM(p) {
-		PROC_LOCK(p);
-		if (p->p_tracevp == vp) {
-			mtx_lock(&ktrace_mtx);
-			ktr_freeproc(p, &cred, NULL);
-			mtx_unlock(&ktrace_mtx);
-			vrele_count++;
-		}
-		PROC_UNLOCK(p);
-		if (cred != NULL) {
-			crfree(cred);
-			cred = NULL;
-		}
+	PROC_LOCK(p);
+	mtx_lock(&ktrace_mtx);
+	if (p->p_tracevp == vp)
+		ktr_freeproc(p, &cred, NULL);
+	mtx_unlock(&ktrace_mtx);
+	PROC_UNLOCK(p);
+	if (cred != NULL) {
+		crfree(cred);
+		cred = NULL;
 	}
 	sx_sunlock(&allproc_lock);
-
-	while (vrele_count-- > 0)
-		vrele(vp);
+	vrele(vp);
+	vrele(vp);
 }
 
 /*


More information about the dev-commits-src-main mailing list