diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in
index 1887b8980e928d5bf0ece1c1fc16308517ffca03..e34b4e586cb0f1532a9e431688e3791beab2c18b 100644
--- a/slurm/slurm.h.in
+++ b/slurm/slurm.h.in
@@ -1590,11 +1590,6 @@ typedef struct {
 				 * start_range_1, end_range_1,
 				 * start_range_2, .., -1  */
 	char *mp_str;
-	int *mp_used_inx;       /* list index pairs into node_table
-				 * for used *mp_str:
-				 * start_range_1, end_range_1,
-				 * start_range_2, .., -1  */
-	char *mp_used_str;
 	uint16_t node_use;
 	char *ramdiskimage;     /* RamDiskImage for this block */
 	char *reason;
diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c
index 2ec178ba3aa905433f1b19ed3fc0abec70118bc4..b8f76b5ae443f4d04979632e4c21940983726d03 100644
--- a/src/common/slurm_protocol_defs.c
+++ b/src/common/slurm_protocol_defs.c
@@ -2228,8 +2228,6 @@ extern void slurm_free_block_info_members(block_info_t *block_info)
 		xfree(block_info->mloaderimage);
 		xfree(block_info->mp_inx);
 		xfree(block_info->mp_str);
-		xfree(block_info->mp_used_inx);
-		xfree(block_info->mp_used_str);
 		xfree(block_info->ramdiskimage);
 		xfree(block_info->reason);
 	}
diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index d55231c6d99b9ef34cde5541be4edd440ea34ae4..fe7a5869128fc154479afd7b2327d148563579eb 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -8726,18 +8726,11 @@ static void _pack_block_info_msg(block_info_t *block_info, Buf buffer,
 		packstr(block_info->linuximage, buffer);
 		packstr(block_info->mloaderimage, buffer);
 		packstr(block_info->mp_str, buffer);
-		packstr(block_info->mp_used_str, buffer);
 		pack32(block_info->cnode_cnt, buffer);
 		pack16(block_info->node_use, buffer);
 		packstr(block_info->ramdiskimage, buffer);
 		packstr(block_info->reason, buffer);
 		pack16(block_info->state, buffer);
-		if (block_info->mp_used_inx) {
-			char *bitfmt = inx2bitfmt(block_info->mp_used_inx);
-			packstr(bitfmt, buffer);
-			xfree(bitfmt);
-		} else
-			packnull(buffer);
 	} else if (protocol_version >= SLURM_2_3_PROTOCOL_VERSION) {
 		if (!block_info) {
 			packnull(buffer);
@@ -8810,19 +8803,14 @@ static void _pack_block_info_msg(block_info_t *block_info, Buf buffer,
 		packstr(block_info->linuximage, buffer);
 		packstr(block_info->mloaderimage, buffer);
 		packstr(block_info->mp_str, buffer);
-		packstr(block_info->mp_used_str, buffer);
+		packnull(buffer); /* for mp_used_str */
 		pack32(block_info->cnode_cnt, buffer);
 		pack16(block_info->node_use, buffer);
 		packnull(buffer); /* for user name */
 		packstr(block_info->ramdiskimage, buffer);
 		packstr(block_info->reason, buffer);
 		pack16(block_info->state, buffer);
-		if (block_info->mp_used_inx) {
-			char *bitfmt = inx2bitfmt(block_info->mp_used_inx);
-			packstr(bitfmt, buffer);
-			xfree(bitfmt);
-		} else
-			packnull(buffer);
+		packnull(buffer); /* for mp_used_inx */
 	} else if (protocol_version >= SLURM_2_2_PROTOCOL_VERSION) {
 		if (!block_info) {
 			packnull(buffer);
@@ -9033,8 +9021,6 @@ extern int slurm_unpack_block_info_members(block_info_t *block_info, Buf buffer,
 				       &uint32_tmp, buffer);
 		safe_unpackstr_xmalloc(&(block_info->mp_str), &uint32_tmp,
 				       buffer);
-		safe_unpackstr_xmalloc(&(block_info->mp_used_str), &uint32_tmp,
-				       buffer);
 		safe_unpack32(&block_info->cnode_cnt, buffer);
 		safe_unpack16(&block_info->node_use, buffer);
 		safe_unpackstr_xmalloc(&block_info->ramdiskimage,
@@ -9042,13 +9028,6 @@ extern int slurm_unpack_block_info_members(block_info_t *block_info, Buf buffer,
 		safe_unpackstr_xmalloc(&block_info->reason,
 				       &uint32_tmp, buffer);
 		safe_unpack16(&block_info->state, buffer);
-		safe_unpackstr_xmalloc(&mp_inx_str, &uint32_tmp, buffer);
-		if (mp_inx_str == NULL) {
-			block_info->mp_used_inx = bitfmt2int("");
-		} else {
-			block_info->mp_used_inx = bitfmt2int(mp_inx_str);
-			xfree(mp_inx_str);
-		}
 	} else if (protocol_version >= SLURM_2_3_PROTOCOL_VERSION) {
 		safe_unpackstr_xmalloc(&block_info->bg_block_id,
 				       &uint32_tmp, buffer);
@@ -9109,8 +9088,8 @@ extern int slurm_unpack_block_info_members(block_info_t *block_info, Buf buffer,
 				       &uint32_tmp, buffer);
 		safe_unpackstr_xmalloc(&(block_info->mp_str), &uint32_tmp,
 				       buffer);
-		safe_unpackstr_xmalloc(&(block_info->mp_used_str), &uint32_tmp,
-				       buffer);
+		safe_unpackstr_xmalloc(&mp_inx_str, &uint32_tmp, buffer);
+		xfree(mp_inx_str);
 		safe_unpack32(&block_info->cnode_cnt, buffer);
 		safe_unpack16(&block_info->node_use, buffer);
 		safe_unpackstr_xmalloc(&mp_inx_str, &uint32_tmp, buffer);
@@ -9121,12 +9100,7 @@ extern int slurm_unpack_block_info_members(block_info_t *block_info, Buf buffer,
 				       &uint32_tmp, buffer);
 		safe_unpack16(&block_info->state, buffer);
 		safe_unpackstr_xmalloc(&mp_inx_str, &uint32_tmp, buffer);
-		if (mp_inx_str == NULL) {
-			block_info->mp_used_inx = bitfmt2int("");
-		} else {
-			block_info->mp_used_inx = bitfmt2int(mp_inx_str);
-			xfree(mp_inx_str);
-		}
+		xfree(mp_inx_str);
 	} else if (protocol_version >= SLURM_2_2_PROTOCOL_VERSION) {
 		safe_unpackstr_xmalloc(&block_info->bg_block_id,
 				       &uint32_tmp, buffer);
diff --git a/src/plugins/select/bluegene/ba_bgq/block_allocator.c b/src/plugins/select/bluegene/ba_bgq/block_allocator.c
index 610b2de099b49372c0e64291c04aa55c4389dda0..2afb99ae157edae48c67c99f46d18328eb91684a 100644
--- a/src/plugins/select/bluegene/ba_bgq/block_allocator.c
+++ b/src/plugins/select/bluegene/ba_bgq/block_allocator.c
@@ -1191,7 +1191,23 @@ extern int ba_sub_block_in_record_clear(
 			error("ba_sub_block_in_record_clear: "
 			      "didn't have the units_used bitmap "
 			      "for some reason?");
-			continue;
+			break;
+		} else if (!ba_mp->cnode_bitmap) {
+			/* If the job allocation has already finished
+			   before processing the job step completion
+			   this could happen, but it should already be
+			   checked before it gets here so this should
+			   never happen, this is just for safely sake.
+			*/
+			error("ba_sub_block_in_record_clear: no cnode_bitmap? "
+			      "job %u(%p) is in state %s on block %s %u(%p). "
+			      "This should never happen.",
+			      step_ptr->job_ptr->job_id, step_ptr->job_ptr,
+			      job_state_string(step_ptr->job_ptr->job_state
+					       & (~JOB_CONFIGURING)),
+			      bg_record->bg_block_id, bg_record->job_running,
+			      bg_record->job_ptr);
+			break;
 		}
 
 		bit_not(jobinfo->units_used);
@@ -1222,6 +1238,7 @@ extern int ba_sub_block_in_record_clear(
 			xfree(tmp_char3);
 			FREE_NULL_BITMAP(total_bitmap);
 		}
+		break;
 	}
 	list_iterator_destroy(itr);
 
@@ -1244,6 +1261,17 @@ extern void ba_sync_job_to_block(bg_record_t *bg_record,
 			ba_mp = list_peek(bg_record->ba_mp_list);
 			list_append(bg_record->job_list, job_ptr);
 			jobinfo = job_ptr->select_jobinfo->data;
+			/* If you were switching from no sub-block
+			   allocations to allowing it, the units_avail
+			   wouldn't be around for any jobs, but no
+			   problem since they were always the size of
+			   the block.
+			*/
+			if (!jobinfo->units_avail) {
+				jobinfo->units_avail =
+					bit_copy(ba_mp->cnode_bitmap);
+				bit_not(jobinfo->units_avail);
+			}
 			if (bit_overlap(ba_mp->cnode_bitmap,
 					jobinfo->units_avail)) {
 				error("we have an overlapping job allocation "
diff --git a/src/plugins/select/bluegene/bg_dynamic_block.c b/src/plugins/select/bluegene/bg_dynamic_block.c
index 2e688e821ada8cc1352090e8b14bd24baa74551c..192f7dcb8784fd13126a98d4e110fda49a0aa4ba 100644
--- a/src/plugins/select/bluegene/bg_dynamic_block.c
+++ b/src/plugins/select/bluegene/bg_dynamic_block.c
@@ -501,7 +501,6 @@ extern bg_record_t *create_small_record(bg_record_t *bg_record,
 
 	found_record->ionode_bitmap = bit_copy(ionodes);
 	ba_set_ionode_str(found_record);
-	found_record->mp_used_bitmap = bit_alloc(node_record_count);
 
 	found_record->ba_mp_list = list_create(destroy_ba_mp);
 
diff --git a/src/plugins/select/bluegene/bg_record_functions.c b/src/plugins/select/bluegene/bg_record_functions.c
index 110bfb0220fa55a1fce2c49826ac5c21cc8f0f7f..f198e5d5432e016839234c1e0063734572786754 100644
--- a/src/plugins/select/bluegene/bg_record_functions.c
+++ b/src/plugins/select/bluegene/bg_record_functions.c
@@ -111,8 +111,6 @@ extern void destroy_bg_record(void *object)
 		xfree(bg_record->linuximage);
 		xfree(bg_record->mloaderimage);
 		FREE_NULL_BITMAP(bg_record->mp_bitmap);
-		xfree(bg_record->mp_str);
-		FREE_NULL_BITMAP(bg_record->mp_used_bitmap);
 		xfree(bg_record->ramdiskimage);
 		xfree(bg_record->reason);
 
@@ -361,14 +359,6 @@ extern void copy_bg_record(bg_record_t *fir_record, bg_record_t *sec_record)
 	sec_record->boot_state = fir_record->boot_state;
 	sec_record->boot_count = fir_record->boot_count;
 
-	FREE_NULL_BITMAP(sec_record->mp_used_bitmap);
-	if (fir_record->mp_used_bitmap
-	    && (sec_record->mp_used_bitmap
-		= bit_copy(fir_record->mp_used_bitmap)) == NULL) {
-		error("Unable to copy mp_used_bitmap for %s",
-		      fir_record->mp_str);
-		sec_record->mp_used_bitmap = NULL;
-	}
 	sec_record->cnode_cnt = fir_record->cnode_cnt;
 	sec_record->cnode_err_cnt = fir_record->cnode_err_cnt;
 
@@ -594,7 +584,6 @@ extern int add_bg_record(List records, List *used_nodes,
 	   want anything set we also don't want the bg_record->ionode_str set.
 	*/
 	bg_record->ionode_bitmap = bit_alloc(bg_conf->ionodes_per_mp);
-	bg_record->mp_used_bitmap = bit_alloc(node_record_count);
 
 	len = strlen(blockreq->save_name);
 	i=0;
@@ -1401,7 +1390,8 @@ extern int bg_reset_block(bg_record_t *bg_record, struct job_record *job_ptr)
 	if (bg_record->job_list)
 		ba_remove_job_in_block_job_list(bg_record, job_ptr);
 
-	if (bg_record->job_running > NO_JOB_RUNNING) {
+	if ((bg_record->job_running > NO_JOB_RUNNING)
+	    && (!bg_record->job_list || !list_count(bg_record->job_list))) {
 #ifndef HAVE_BG_L_P
 		/* Just in case the slurmctld wasn't up at the
 		   time a step completion message came through
@@ -1420,10 +1410,11 @@ extern int bg_reset_block(bg_record_t *bg_record, struct job_record *job_ptr)
 		list_iterator_destroy(itr);
 #endif
 		bg_record->job_running = NO_JOB_RUNNING;
-		if (bg_record->job_ptr) {
-			num_unused_cpus += bg_record->job_ptr->total_cpus;
-			bg_record->job_ptr = NULL;
-		}
+	}
+
+	if (bg_record->job_ptr) {
+		num_unused_cpus += bg_record->job_ptr->total_cpus;
+		bg_record->job_ptr = NULL;
 	}
 
 	/* remove user from list */
diff --git a/src/plugins/select/bluegene/bg_structs.h b/src/plugins/select/bluegene/bg_structs.h
index 926e7615c15d0c36fd22c60cfdf69ac55cc86c79..c9d593c30880c6b3b2e2f9619c38c0de00b86361 100644
--- a/src/plugins/select/bluegene/bg_structs.h
+++ b/src/plugins/select/bluegene/bg_structs.h
@@ -141,8 +141,6 @@ typedef struct bg_record {
 					   of block */
 	int mp_count;                   /* size */
 	char *mp_str;   		/* String of midplanes in block */
-	bitstr_t *mp_used_bitmap;       /* midplanes used in this bitmap */
-	char *mp_used_str;   		/* String of midplanes used in block */
 	uint16_t node_use;      	/* either COPROCESSOR or VIRTUAL */
 	struct bg_record *original;     /* if this is a copy this is a
 					   pointer to the original */
diff --git a/src/plugins/select/bluegene/bl_bgq/bridge_linker.cc b/src/plugins/select/bluegene/bl_bgq/bridge_linker.cc
index b79f4b55fd3451f9995717e0c838449e1f342475..f3b928dbecc349f432333983f804076bb8706deb 100644
--- a/src/plugins/select/bluegene/bl_bgq/bridge_linker.cc
+++ b/src/plugins/select/bluegene/bl_bgq/bridge_linker.cc
@@ -300,6 +300,8 @@ static void _remove_jobs_on_block_and_reset(char *block_id,
 {
 	bg_record_t *bg_record = NULL;
 	int job_remove_failed = 0;
+	slurmctld_lock_t job_read_lock =
+		{ NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK };
 
 	if (!block_id) {
 		error("_remove_jobs_on_block_and_reset: no block name given");
@@ -310,6 +312,13 @@ static void _remove_jobs_on_block_and_reset(char *block_id,
 		job_remove_failed = 1;
 
 	/* remove the block's users */
+
+	/* Lock job read before block to avoid
+	 * issues where a step could complete after the job completion
+	 * has taken place (since we are on a thread here).
+	 */
+	if (job_ptr)
+		lock_slurmctld(job_read_lock);
 	slurm_mutex_lock(&block_state_mutex);
 	bg_record = find_bg_record_in_list(bg_lists->main, block_id);
 	if (bg_record) {
@@ -333,7 +342,8 @@ static void _remove_jobs_on_block_and_reset(char *block_id,
 	}
 
 	slurm_mutex_unlock(&block_state_mutex);
-
+	if (job_ptr)
+		unlock_slurmctld(job_read_lock);
 }
 
 extern int bridge_init(char *properties_file)
diff --git a/src/plugins/select/bluegene/select_bluegene.c b/src/plugins/select/bluegene/select_bluegene.c
index 6e97e5d5e5e4eb6cd66eb3eeb3851461e4db5854..269a30262abe7cbe2055aeb801d8f6c8630d8150 100644
--- a/src/plugins/select/bluegene/select_bluegene.c
+++ b/src/plugins/select/bluegene/select_bluegene.c
@@ -343,10 +343,9 @@ static void _set_bg_lists()
 static bg_record_t *_translate_info_2_record(block_info_t *block_info)
 {
 	bg_record_t *bg_record = NULL;
-	bitstr_t *mp_bitmap = NULL, *ionode_bitmap = NULL, *used_bitmap = NULL;
+	bitstr_t *mp_bitmap = NULL, *ionode_bitmap = NULL;
 
 	mp_bitmap = bit_alloc(node_record_count);
-	used_bitmap = bit_alloc(node_record_count);
 	ionode_bitmap = bit_alloc(bg_conf->ionodes_per_mp);
 
 	if (block_info->mp_inx
@@ -354,11 +353,6 @@ static bg_record_t *_translate_info_2_record(block_info_t *block_info)
 		error("Job state recovered incompatible with "
 		      "bluegene.conf. mp=%u",
 		      node_record_count);
-	if (block_info->mp_used_inx
-	    && inx2bitstr(used_bitmap, block_info->mp_used_inx) == -1)
-		error("Job state recovered incompatible with "
-		      "bluegene.conf. used=%u",
-		      node_record_count);
 	if (block_info->ionode_inx
 	    && inx2bitstr(ionode_bitmap, block_info->ionode_inx) == -1)
 		error("Job state recovered incompatible with "
@@ -386,9 +380,6 @@ static bg_record_t *_translate_info_2_record(block_info_t *block_info)
 		}
 	}
 
-	bg_record->mp_used_bitmap = used_bitmap;
-	used_bitmap = NULL;
-
 	bg_record->mp_bitmap = mp_bitmap;
 	mp_bitmap = NULL;
 
@@ -441,8 +432,13 @@ static void _local_pack_block_job_info(struct job_record *job_ptr, Buf buffer,
 	memset(&block_job, 0, sizeof(block_job_info_t));
 	block_job.job_id = job_ptr->job_id;
 	block_job.user_id = job_ptr->user_id;
-	block_job.user_name = jobinfo->user_name;
-	block_job.cnodes = jobinfo->ionode_str;
+	if (jobinfo) {
+		block_job.user_name = jobinfo->user_name;
+		block_job.cnodes = jobinfo->ionode_str;
+	} else
+		error("NO JOBINFO for job %u magic %u!!!!!!!!!!!!!!",
+		      job_ptr->job_id, job_ptr->magic);
+
 	/* block_job.cnode_inx -- try not to set */
 	slurm_pack_block_job_info(&block_job, buffer, protocol_version);
 }
@@ -487,13 +483,17 @@ static void _pack_block(bg_record_t *bg_record, Buf buffer,
 			while ((job_ptr = list_next(itr))) {
 				if (job_ptr->magic != JOB_MAGIC) {
 					list_delete_item(itr);
+					slurm_pack_block_job_info(
+						NULL, buffer,
+						protocol_version);
 					continue;
 				}
 				_local_pack_block_job_info(
 					job_ptr, buffer, protocol_version);
 			}
 			list_iterator_destroy(itr);
-		} else if (bg_record->job_ptr) {
+		} else if (bg_record->job_ptr
+			   && (bg_record->job_ptr->magic == JOB_MAGIC)) {
 			pack32(1, buffer);
 			_local_pack_block_job_info(
 				bg_record->job_ptr, buffer, protocol_version);
@@ -505,13 +505,11 @@ static void _pack_block(bg_record_t *bg_record, Buf buffer,
 		packstr(bg_record->linuximage, buffer);
 		packstr(bg_record->mloaderimage, buffer);
 		packstr(bg_record->mp_str, buffer);
-		packstr(bg_record->mp_used_str, buffer);
 		pack32((uint32_t)bg_record->cnode_cnt, buffer);
 		pack16((uint16_t)bg_record->node_use, buffer);
 		packstr(bg_record->ramdiskimage, buffer);
 		packstr(bg_record->reason, buffer);
 		pack16((uint16_t)bg_record->state, buffer);
-		pack_bit_fmt(bg_record->mp_used_bitmap, buffer);
 	} else if (protocol_version >= SLURM_2_3_PROTOCOL_VERSION) {
 		packstr(bg_record->bg_block_id, buffer);
 		packstr(bg_record->blrtsimage, buffer);
@@ -551,14 +549,14 @@ static void _pack_block(bg_record_t *bg_record, Buf buffer,
 		packstr(bg_record->linuximage, buffer);
 		packstr(bg_record->mloaderimage, buffer);
 		packstr(bg_record->mp_str, buffer);
-		packstr(bg_record->mp_used_str, buffer);
+		packnull(buffer); /* for mp_used_str */
 		pack32((uint32_t)bg_record->cnode_cnt, buffer);
 		pack16((uint16_t)bg_record->node_use, buffer);
 		packnull(buffer); /* for user_name */
 		packstr(bg_record->ramdiskimage, buffer);
 		packstr(bg_record->reason, buffer);
 		pack16((uint16_t)bg_record->state, buffer);
-		pack_bit_fmt(bg_record->mp_used_bitmap, buffer);
+		packnull(buffer); /* for mp_used_inx */
 	} else if (protocol_version >= SLURM_2_2_PROTOCOL_VERSION) {
 		packstr(bg_record->bg_block_id, buffer);
 #ifdef HAVE_BGL
@@ -1386,6 +1384,9 @@ extern int select_p_state_save(char *dir_name)
 	char *old_file, *new_file, *reg_file;
 	uint32_t blocks_packed = 0, tmp_offset, block_offset;
 	Buf buffer = init_buf(BUF_SIZE);
+	slurmctld_lock_t job_read_lock =
+		{ NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK };
+
 	DEF_TIMERS;
 
 	debug("bluegene: select_p_state_save");
@@ -1395,6 +1396,9 @@ extern int select_p_state_save(char *dir_name)
 	block_offset = get_buf_offset(buffer);
 	pack32(blocks_packed, buffer);
 
+	/* Lock job read before block to avoid deadlock job lock is
+	 * needed because we look at the job_ptr's to send job info. */
+	lock_slurmctld(job_read_lock);
 	/* write block records to buffer */
 	slurm_mutex_lock(&block_state_mutex);
 	itr = list_iterator_create(bg_lists->main);
@@ -1410,6 +1414,7 @@ extern int select_p_state_save(char *dir_name)
 	}
 	list_iterator_destroy(itr);
 	slurm_mutex_unlock(&block_state_mutex);
+	unlock_slurmctld(job_read_lock);
 	tmp_offset = get_buf_offset(buffer);
 	set_buf_offset(buffer, block_offset);
 	pack32(blocks_packed, buffer);
@@ -1812,7 +1817,7 @@ extern bitstr_t *select_p_step_pick_nodes(struct job_record *job_ptr,
 {
 	bitstr_t *picked_mps = NULL;
 	bg_record_t *bg_record = NULL;
-	char *tmp_char = NULL, *tmp_char2 = NULL;
+	char *tmp_char = NULL;
 	ba_mp_t *ba_mp = NULL;
 	select_jobinfo_t *jobinfo = NULL;
 	int dim;
@@ -1829,7 +1834,6 @@ extern bitstr_t *select_p_step_pick_nodes(struct job_record *job_ptr,
 		      "trying to start a step on it?",
 		      job_ptr->job_id);
 
-	xassert(bg_record->mp_used_bitmap);
 	xassert(!step_jobinfo->units_used);
 
 	xfree(step_jobinfo->bg_block_id);
@@ -1872,7 +1876,6 @@ extern bitstr_t *select_p_step_pick_nodes(struct job_record *job_ptr,
 			bit_or(ba_mp->cnode_bitmap, step_jobinfo->units_used);
 		}
 
-		bit_or(bg_record->mp_used_bitmap, picked_mps);
 		step_jobinfo->ionode_str = xstrdup(jobinfo->ionode_str);
 	} else if (jobinfo->units_avail) {
 		bitstr_t *total_bitmap = jobinfo->units_used;
@@ -1897,7 +1900,6 @@ extern bitstr_t *select_p_step_pick_nodes(struct job_record *job_ptr,
 		node_count = step_jobinfo->cnode_cnt;
 		if (!(picked_mps = bit_copy(job_ptr->node_bitmap)))
 			fatal("bit_copy malloc failure");
-		bit_or(bg_record->mp_used_bitmap, picked_mps);
 		bit_or(jobinfo->units_used, step_jobinfo->units_used);
 		for (dim = 0; dim < step_jobinfo->dim_cnt; dim++) {
 			/* The IBM software works off a relative
@@ -1923,7 +1925,6 @@ extern bitstr_t *select_p_step_pick_nodes(struct job_record *job_ptr,
 			    bg_record, &node_count, step_jobinfo))) {
 		if (!(picked_mps = bit_alloc(bit_size(job_ptr->node_bitmap))))
 			fatal("bit_copy malloc failure");
-		bit_set(bg_record->mp_used_bitmap, ba_mp->index);
 		bit_set(picked_mps, ba_mp->index);
 		for (dim = 0; dim < step_jobinfo->dim_cnt; dim++) {
 			/* The IBM software works off a relative
@@ -1951,14 +1952,10 @@ extern bitstr_t *select_p_step_pick_nodes(struct job_record *job_ptr,
 	if (picked_mps) {
 		if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) {
 			tmp_char = bitmap2node_name(picked_mps);
-			tmp_char2 = bitmap2node_name(
-				bg_record->mp_used_bitmap);
-			info("select_p_step_pick_nodes: picked %s mps on "
-			     "block %s used is now %s",
-			     tmp_char, bg_record->bg_block_id,
-			     tmp_char2);
+			info("select_p_step_pick_nodes: new step for job %u "
+			     "will be running on %s(%s)",
+			     job_ptr->job_id, bg_record->bg_block_id, tmp_char);
 			xfree(tmp_char);
-			xfree(tmp_char2);
 		}
 		step_jobinfo->cnode_cnt = node_count;
 	}
@@ -1975,46 +1972,42 @@ extern int select_p_step_finish(struct step_record *step_ptr)
 	bg_record_t *bg_record = NULL;
 	select_jobinfo_t *jobinfo = NULL;
 	int rc = SLURM_SUCCESS;
-	char *tmp_char = NULL, *tmp_char2 = NULL;
+	char *tmp_char = NULL;
 
 	xassert(step_ptr);
 
-	slurm_mutex_lock(&block_state_mutex);
-
-	jobinfo = step_ptr->job_ptr->select_jobinfo->data;
-	bg_record = jobinfo->bg_record;
 
-	if (!bg_record)
-		fatal("This step %u.%u does not have a bg block "
-		      "assigned to it, but for some reason we are "
-		      "trying to end the step?",
+	if (IS_JOB_COMPLETING(step_ptr->job_ptr)) {
+		debug("step completion %u.%u was received after job "
+		      "allocation is already completing, no cleanup needed",
 		      step_ptr->job_ptr->job_id, step_ptr->step_id);
-	/* At this moment the step_node_bitmap has already been
-	   cleared and the step_node_bitmap has been set so use it
-	   instead.
-	*/
-	bit_not(step_ptr->step_node_bitmap);
-	bit_and(bg_record->mp_used_bitmap, step_ptr->step_node_bitmap);
-	bit_not(step_ptr->step_node_bitmap);
-
-	if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) {
-		tmp_char = bitmap2node_name(bg_record->mp_used_bitmap);
-		tmp_char2 = bitmap2node_name(step_ptr->step_node_bitmap);
-		info("select_p_step_finish: cleared %s "
-		     "from job step %u.%u, now %s used",
-		     tmp_char2, step_ptr->job_ptr->job_id, step_ptr->step_id,
-		     tmp_char);
-		xfree(tmp_char);
-		xfree(tmp_char2);
+		return SLURM_SUCCESS;
 	}
 
+	jobinfo = step_ptr->job_ptr->select_jobinfo->data;
+
 	if (jobinfo->units_avail)
 		rc = ba_sub_block_in_bitmap_clear(
 			step_ptr->select_jobinfo->data, jobinfo->units_used);
-	else
+	else {
+		slurm_mutex_lock(&block_state_mutex);
+		bg_record = jobinfo->bg_record;
+
+		if (!bg_record)
+			fatal("This step %u.%u does not have a bg block "
+			      "assigned to it, but for some reason we are "
+			      "trying to end the step?",
+			      step_ptr->job_ptr->job_id, step_ptr->step_id);
 		rc = ba_sub_block_in_record_clear(bg_record, step_ptr);
+		slurm_mutex_unlock(&block_state_mutex);
+	}
 
-	slurm_mutex_unlock(&block_state_mutex);
+	if (bg_conf->slurm_debug_flags & DEBUG_FLAG_BG_PICK) {
+		tmp_char = bitmap2node_name(step_ptr->step_node_bitmap);
+		info("select_p_step_finish: step %u.%u cleared from %s",
+		     step_ptr->job_ptr->job_id, step_ptr->step_id, tmp_char);
+		xfree(tmp_char);
+	}
 
 	return rc;
 }
@@ -2043,6 +2036,14 @@ extern int select_p_pack_select_info(time_t last_query_time,
 
 		if (protocol_version >= SLURM_2_1_PROTOCOL_VERSION) {
 			if (bg_lists->main) {
+				slurmctld_lock_t job_read_lock =
+					{ NO_LOCK, READ_LOCK,
+					  NO_LOCK, NO_LOCK };
+				/* Lock job read before block to avoid
+				 * deadlock job lock is needed because
+				 * we look at the job_ptr's to send
+				 * job info. */
+				lock_slurmctld(job_read_lock);
 				slurm_mutex_lock(&block_state_mutex);
 				itr = list_iterator_create(bg_lists->main);
 				while ((bg_record = list_next(itr))) {
@@ -2054,6 +2055,7 @@ extern int select_p_pack_select_info(time_t last_query_time,
 				}
 				list_iterator_destroy(itr);
 				slurm_mutex_unlock(&block_state_mutex);
+				unlock_slurmctld(job_read_lock);
 			} else {
 				error("select_p_pack_select_info: "
 				      "no bg_lists->main");