svn commit: r297424 - head/sys/compat/linux

Jamie Gritton jamie at FreeBSD.org
Wed Mar 30 17:05:05 UTC 2016


Author: jamie
Date: Wed Mar 30 17:05:04 2016
New Revision: 297424
URL: https://svnweb.freebsd.org/changeset/base/297424

Log:
  Use osd_reserve / osd_jail_set_reserved, which is known to succeed.
  Also don't work around nonexistent osd_register failure.

Modified:
  head/sys/compat/linux/linux_mib.c

Modified: head/sys/compat/linux/linux_mib.c
==============================================================================
--- head/sys/compat/linux/linux_mib.c	Wed Mar 30 17:00:33 2016	(r297423)
+++ head/sys/compat/linux/linux_mib.c	Wed Mar 30 17:05:04 2016	(r297424)
@@ -168,9 +168,6 @@ linux_find_prison(struct prison *spr, st
 	struct prison *pr;
 	struct linux_prison *lpr;
 
-	if (!linux_osd_jail_slot)
-		/* In case osd_register failed. */
-		spr = &prison0;
 	for (pr = spr;; pr = pr->pr_parent) {
 		mtx_lock(&pr->pr_mtx);
 		lpr = (pr == &prison0)
@@ -189,15 +186,14 @@ linux_find_prison(struct prison *spr, st
  * Ensure a prison has its own Linux info.  If lprp is non-null, point it to
  * the Linux info and lock the prison.
  */
-static int
+static void
 linux_alloc_prison(struct prison *pr, struct linux_prison **lprp)
 {
 	struct prison *ppr;
 	struct linux_prison *lpr, *nlpr;
-	int error;
+	void *rsv;
 
 	/* If this prison already has Linux info, return that. */
-	error = 0;
 	lpr = linux_find_prison(pr, &ppr);
 	if (ppr == pr)
 		goto done;
@@ -207,29 +203,24 @@ linux_alloc_prison(struct prison *pr, st
 	 */
 	mtx_unlock(&ppr->pr_mtx);
 	nlpr = malloc(sizeof(struct linux_prison), M_PRISON, M_WAITOK);
+	rsv = osd_reserve(linux_osd_jail_slot);
 	lpr = linux_find_prison(pr, &ppr);
 	if (ppr == pr) {
 		free(nlpr, M_PRISON);
+		osd_free_reserved(rsv);
 		goto done;
 	}
 	/* Inherit the initial values from the ancestor. */
 	mtx_lock(&pr->pr_mtx);
-	error = osd_jail_set(pr, linux_osd_jail_slot, nlpr);
-	if (error == 0) {
-		bcopy(lpr, nlpr, sizeof(*lpr));
-		lpr = nlpr;
-	} else {
-		free(nlpr, M_PRISON);
-		lpr = NULL;
-	}
+	(void)osd_jail_set_reserved(pr, linux_osd_jail_slot, rsv, nlpr);
+	bcopy(lpr, nlpr, sizeof(*lpr));
+	lpr = nlpr;
 	mtx_unlock(&ppr->pr_mtx);
  done:
 	if (lprp != NULL)
 		*lprp = lpr;
 	else
 		mtx_unlock(&pr->pr_mtx);
-
-	return (error);
 }
 
 /*
@@ -249,7 +240,8 @@ linux_prison_create(void *obj, void *dat
 	 * Inherit a prison's initial values from its parent
 	 * (different from JAIL_SYS_INHERIT which also inherits changes).
 	 */
-	return (linux_alloc_prison(pr, NULL));
+	linux_alloc_prison(pr, NULL);
+	return (0);
 }
 
 static int
@@ -345,11 +337,7 @@ linux_prison_set(void *obj, void *data)
 		 * "linux=new" or "linux.*":
 		 * the prison gets its own Linux info.
 		 */
-		error = linux_alloc_prison(pr, &lpr);
-		if (error) {
-			mtx_unlock(&pr->pr_mtx);
-			return (error);
-		}
+		linux_alloc_prison(pr, &lpr);
 		if (osrelease) {
 			error = linux_map_osrel(osrelease, &lpr->pr_osrel);
 			if (error) {
@@ -449,21 +437,18 @@ linux_osd_jail_register(void)
 
 	linux_osd_jail_slot =
 	    osd_jail_register(linux_prison_destructor, methods);
-	if (linux_osd_jail_slot > 0) {
-		/* Copy the system linux info to any current prisons. */
-		sx_xlock(&allprison_lock);
-		TAILQ_FOREACH(pr, &allprison, pr_list)
-			(void)linux_alloc_prison(pr, NULL);
-		sx_xunlock(&allprison_lock);
-	}
+	/* Copy the system linux info to any current prisons. */
+	sx_slock(&allprison_lock);
+	TAILQ_FOREACH(pr, &allprison, pr_list)
+		linux_alloc_prison(pr, NULL);
+	sx_sunlock(&allprison_lock);
 }
 
 void
 linux_osd_jail_deregister(void)
 {
 
-	if (linux_osd_jail_slot)
-		osd_jail_deregister(linux_osd_jail_slot);
+	osd_jail_deregister(linux_osd_jail_slot);
 }
 
 void


More information about the svn-src-all mailing list