Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Feb 2014 12:45:35 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r262039 - stable/10/sys/kern
Message-ID:  <201402171245.s1HCjZej042023@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Mon Feb 17 12:45:35 2014
New Revision: 262039
URL: http://svnweb.freebsd.org/changeset/base/262039

Log:
  MFC r259587: Invoke the kld_* event handlers from linker_load_file() ...

Modified:
  stable/10/sys/kern/kern_linker.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/kern_linker.c
==============================================================================
--- stable/10/sys/kern/kern_linker.c	Mon Feb 17 12:42:57 2014	(r262038)
+++ stable/10/sys/kern/kern_linker.c	Mon Feb 17 12:45:35 2014	(r262039)
@@ -434,6 +434,7 @@ linker_load_file(const char *filename, l
 				linker_file_unload(lf, LINKER_UNLOAD_FORCE);
 				return (ENOEXEC);
 			}
+			EVENTHANDLER_INVOKE(kld_load, lf);
 			*result = lf;
 			return (0);
 		}
@@ -609,6 +610,12 @@ linker_file_unload(linker_file_t file, i
 		return (0);
 	}
 
+	/* Give eventhandlers a chance to prevent the unload. */
+	error = 0;
+	EVENTHANDLER_INVOKE(kld_unload_try, file, &error);
+	if (error != 0)
+		return (EBUSY);
+
 	KLD_DPF(FILE, ("linker_file_unload: file is unloading,"
 	    " informing modules\n"));
 
@@ -690,6 +697,10 @@ linker_file_unload(linker_file_t file, i
 	}
 
 	LINKER_UNLOAD(file);
+
+	EVENTHANDLER_INVOKE(kld_unload, file->filename, file->address,
+	    file->size);
+
 	if (file->filename) {
 		free(file->filename, M_LINKER);
 		file->filename = NULL;
@@ -1033,10 +1044,7 @@ kern_kldload(struct thread *td, const ch
 	lf->userrefs++;
 	if (fileid != NULL)
 		*fileid = lf->id;
-
-	sx_downgrade(&kld_sx);
-	EVENTHANDLER_INVOKE(kld_load, lf);
-	sx_sunlock(&kld_sx);
+	sx_xunlock(&kld_sx);
 
 done:
 	CURVNET_RESTORE();
@@ -1066,9 +1074,6 @@ int
 kern_kldunload(struct thread *td, int fileid, int flags)
 {
 	linker_file_t lf;
-	char *filename = NULL;
-	caddr_t address;
-	size_t size;
 	int error = 0;
 
 	if ((error = securelevel_gt(td->td_ucred, 0)) != 0)
@@ -1083,10 +1088,7 @@ kern_kldunload(struct thread *td, int fi
 	if (lf) {
 		KLD_DPF(FILE, ("kldunload: lf->userrefs=%d\n", lf->userrefs));
 
-		EVENTHANDLER_INVOKE(kld_unload_try, lf, &error);
-		if (error != 0)
-			error = EBUSY;
-		else if (lf->userrefs == 0) {
+		if (lf->userrefs == 0) {
 			/*
 			 * XXX: maybe LINKER_UNLOAD_FORCE should override ?
 			 */
@@ -1094,11 +1096,6 @@ kern_kldunload(struct thread *td, int fi
 			    " loaded by the kernel\n");
 			error = EBUSY;
 		} else {
-			/* Save data needed for the kld_unload callbacks. */
-			filename = strdup(lf->filename, M_TEMP);
-			address = lf->address;
-			size = lf->size;
-
 			lf->userrefs--;
 			error = linker_file_unload(lf, flags);
 			if (error)
@@ -1106,14 +1103,7 @@ kern_kldunload(struct thread *td, int fi
 		}
 	} else
 		error = ENOENT;
-
-	if (error == 0) {
-		sx_downgrade(&kld_sx);
-		EVENTHANDLER_INVOKE(kld_unload, filename, address, size);
-		sx_sunlock(&kld_sx);
-	} else
-		sx_xunlock(&kld_sx);
-	free(filename, M_TEMP);
+	sx_xunlock(&kld_sx);
 
 	CURVNET_RESTORE();
 	return (error);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201402171245.s1HCjZej042023>