From 873c8eb133f40f1715d566e71087021c6a3ebe7a Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Thu, 19 Feb 2009 00:55:16 +0000
Subject: [PATCH] svn merge -r16584:16594
 https://eris.llnl.gov/svn/slurm/branches/slurm-1.3

---
 NEWS                                      |  2 ++
 src/plugins/select/linear/select_linear.c | 33 ++++++++++++++++-------
 2 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/NEWS b/NEWS
index 10156aa5c42..32cc70e7279 100644
--- a/NEWS
+++ b/NEWS
@@ -178,6 +178,8 @@ documents those changes that are of interest to users and admins.
  -- Fix bug in logic to remove a job's dependency, could result in abort.
  -- Add new error message to sched/wiki and sched/wiki2 (Maui and Moab) for
     STARTJOB request: "TASKLIST includes non-responsive nodes".
+ -- Fix bug in select/linear when used with sched/gang that can result in a 
+    job's required or excluded node specification being ignored.
 
 * Changes in SLURM 1.3.13
 =========================
diff --git a/src/plugins/select/linear/select_linear.c b/src/plugins/select/linear/select_linear.c
index 5fea9e42949..5ff87bace46 100644
--- a/src/plugins/select/linear/select_linear.c
+++ b/src/plugins/select/linear/select_linear.c
@@ -815,21 +815,34 @@ static int _find_job_mate(struct job_record *job_ptr, bitstr_t *bitmap,
 {
 	ListIterator job_iterator;
 	struct job_record *job_scan_ptr;
+	int rc = EINVAL;
 
 	job_iterator = list_iterator_create(job_list);
 	while ((job_scan_ptr = (struct job_record *) list_next(job_iterator))) {
-		if ((job_scan_ptr->part_ptr == job_ptr->part_ptr) &&
-		    (job_scan_ptr->job_state == JOB_RUNNING) &&
-		    (job_scan_ptr->node_cnt == req_nodes) &&
-		    (job_scan_ptr->total_procs >= job_ptr->num_procs) &&
-		    bit_super_set(job_scan_ptr->node_bitmap, bitmap)) {
-			bit_and(bitmap, job_scan_ptr->node_bitmap);
-			job_ptr->total_procs = job_scan_ptr->total_procs;
-			return SLURM_SUCCESS;
-		}
+		if ((job_scan_ptr->part_ptr  != job_ptr->part_ptr) ||
+		    (job_scan_ptr->job_state != JOB_RUNNING) ||
+		    (job_scan_ptr->node_cnt  != req_nodes) ||
+		    (job_scan_ptr->total_procs < job_ptr->num_procs) ||
+		    (!bit_super_set(job_scan_ptr->node_bitmap, bitmap)))
+			continue;
+
+		if (job_ptr->details->req_node_bitmap &&
+		    (!bit_super_set(job_ptr->details->req_node_bitmap,
+				    job_scan_ptr->node_bitmap)))
+			continue;	/* Required nodes missing from job */
+
+		if (job_ptr->details->exc_node_bitmap &&
+		    (bit_overlap(job_ptr->details->exc_node_bitmap,
+				 job_scan_ptr->node_bitmap) != 0))
+			continue;	/* Excluded nodes in this job */
+
+		bit_and(bitmap, job_scan_ptr->node_bitmap);
+		job_ptr->total_procs = job_scan_ptr->total_procs;
+		rc = SLURM_SUCCESS;
+		break;
 	}
 	list_iterator_destroy(job_iterator);
-	return EINVAL;
+	return rc;
 }
 
 /* _job_test - does most of the real work for select_p_job_test(), which 
-- 
GitLab