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

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
  Approved by:  re (gjb)

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

Modified: stable/11/usr.sbin/jail/command.c
==============================================================================
--- stable/11/usr.sbin/jail/command.c   Sun Jul 17 14:05:11 2016        
(r302953)
+++ stable/11/usr.sbin/jail/command.c   Sun Jul 17 14:06:17 2016        
(r302954)
@@ -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/11/usr.sbin/jail/jailp.h
==============================================================================
--- stable/11/usr.sbin/jail/jailp.h     Sun Jul 17 14:05:11 2016        
(r302953)
+++ stable/11/usr.sbin/jail/jailp.h     Sun Jul 17 14:06:17 2016        
(r302954)
@@ -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/11/usr.sbin/jail/state.c
==============================================================================
--- stable/11/usr.sbin/jail/state.c     Sun Jul 17 14:05:11 2016        
(r302953)
+++ stable/11/usr.sbin/jail/state.c     Sun Jul 17 14:06:17 2016        
(r302954)
@@ -397,6 +397,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.
  */
_______________________________________________
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