svn commit: r302958 - stable/10/usr.sbin/jail

Jamie Gritton jamie at FreeBSD.org
Sun Jul 17 14:15:10 UTC 2016


Author: jamie
Date: Sun Jul 17 14:15:08 2016
New Revision: 302958
URL: https://svnweb.freebsd.org/changeset/base/302958

Log:
  MFC r302856:
  
      Fix up the order in which jail creation processes are run, to preserve
      the config file's order in the non-parallel-start case.
  
  PR:		209112

Modified:
  stable/10/usr.sbin/jail/command.c
  stable/10/usr.sbin/jail/jailp.h
  stable/10/usr.sbin/jail/state.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/jail/command.c
==============================================================================
--- stable/10/usr.sbin/jail/command.c	Sun Jul 17 14:13:47 2016	(r302957)
+++ stable/10/usr.sbin/jail/command.c	Sun Jul 17 14:15:08 2016	(r302958)
@@ -92,9 +92,13 @@ next_command(struct cfjail *j)
 	int create_failed, stopping;
 
 	if (paralimit == 0) {
-		requeue(j, &runnable);
+		if (j->flags & JF_FROM_RUNQ)
+			requeue_head(j, &runnable);
+		else
+			requeue(j, &runnable);
 		return 1;
 	}
+	j->flags &= ~JF_FROM_RUNQ;
 	create_failed = (j->flags & (JF_STOP | JF_FAILED)) == JF_FAILED;
 	stopping = (j->flags & JF_STOP) != 0;
 	comparam = *j->comparam;
@@ -160,20 +164,23 @@ next_command(struct cfjail *j)
 int
 finish_command(struct cfjail *j)
 {
+	struct cfjail *rj;
 	int error;
 
 	if (!(j->flags & JF_SLEEPQ))
 		return 0;
 	j->flags &= ~JF_SLEEPQ;
-	if (*j->comparam == IP_STOP_TIMEOUT)
-	{
+	if (*j->comparam == IP_STOP_TIMEOUT) {
 		j->flags &= ~JF_TIMEOUT;
 		j->pstatus = 0;
 		return 0;
 	}
 	paralimit++;
-	if (!TAILQ_EMPTY(&runnable))
-		requeue(TAILQ_FIRST(&runnable), &ready);
+	if (!TAILQ_EMPTY(&runnable)) {
+		rj = TAILQ_FIRST(&runnable);
+		rj->flags |= JF_FROM_RUNQ;
+		requeue(rj, &ready);
+	}
 	error = 0;
 	if (j->flags & JF_TIMEOUT) {
 		j->flags &= ~JF_TIMEOUT;
@@ -259,7 +266,7 @@ next_proc(int nonblock)
 }
 
 /*
- * Run a single command for a jail, possible inside the jail.
+ * Run a single command for a jail, possibly inside the jail.
  */
 static int
 run_command(struct cfjail *j)

Modified: stable/10/usr.sbin/jail/jailp.h
==============================================================================
--- stable/10/usr.sbin/jail/jailp.h	Sun Jul 17 14:13:47 2016	(r302957)
+++ stable/10/usr.sbin/jail/jailp.h	Sun Jul 17 14:15:08 2016	(r302958)
@@ -64,6 +64,7 @@
 #define JF_PERSIST	0x0100	/* Jail is temporarily persistent */
 #define JF_TIMEOUT	0x0200	/* A command (or process kill) timed out */
 #define JF_SLEEPQ	0x0400	/* Waiting on a command and/or timeout */
+#define JF_FROM_RUNQ	0x0800	/* Has already been on the run queue */
 
 #define JF_OP_MASK		(JF_START | JF_SET | JF_STOP)
 #define JF_RESTART		(JF_START | JF_STOP)
@@ -223,6 +224,7 @@ extern struct cfjail *next_jail(void);
 extern int start_state(const char *target, int docf, unsigned state,
     int running);
 extern void requeue(struct cfjail *j, struct cfjails *queue);
+extern void requeue_head(struct cfjail *j, struct cfjails *queue);
 
 extern void yyerror(const char *);
 extern int yylex(void);

Modified: stable/10/usr.sbin/jail/state.c
==============================================================================
--- stable/10/usr.sbin/jail/state.c	Sun Jul 17 14:13:47 2016	(r302957)
+++ stable/10/usr.sbin/jail/state.c	Sun Jul 17 14:15:08 2016	(r302958)
@@ -398,6 +398,14 @@ requeue(struct cfjail *j, struct cfjails
 	}
 }
 
+void
+requeue_head(struct cfjail *j, struct cfjails *queue)
+{
+    TAILQ_REMOVE(j->queue, j, tq);
+    TAILQ_INSERT_HEAD(queue, j, tq);
+    j->queue = queue;
+}
+
 /*
  * Add a dependency edge between two jails.
  */


More information about the svn-src-all mailing list