From db09723695172603ffdaeba67d0b774462aa75e3 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Wed, 26 May 2010 22:09:38 +0000
Subject: [PATCH] the patch is getting too big, things still work for sview. 
 Quite a bit of infrastructure change to allow sview to work cross-cluster

---
 slurm/slurm.h.in                              |   6 +-
 slurm/slurmdb.h                               |   1 +
 src/api/block_info.c                          |   5 -
 src/common/job_resources.c                    |  63 ++---
 src/common/node_select.c                      | 241 ------------------
 src/common/node_select.h                      |  14 -
 src/common/slurm_protocol_defs.c              |  38 +++
 src/common/slurm_protocol_defs.h              |   3 +
 src/common/slurm_protocol_pack.c              | 182 ++++++++++++-
 src/common/slurm_protocol_pack.h              |   4 +-
 src/common/slurm_step_layout.c                |  63 ++---
 src/common/slurmdb_defs.c                     |   8 +-
 .../select/bluegene/plugin/block_sys.c        |   7 +-
 src/plugins/select/bluegene/plugin/sfree.c    |   2 +-
 .../select/bluegene/plugin/slurm_prolog.c     |   2 +-
 src/salloc/salloc.c                           |   2 +-
 src/scontrol/info_block.c                     |   2 +-
 src/scontrol/info_job.c                       |   2 +-
 src/scontrol/scontrol.c                       |  36 ++-
 src/sinfo/sinfo.c                             |   2 +-
 src/slurmctld/proc_req.c                      |   2 +-
 src/smap/partition_functions.c                |   2 +-
 src/srun/allocate.c                           |   2 +-
 src/sview/block_info.c                        |  33 ++-
 src/sview/common.c                            |   6 -
 src/sview/config_info.c                       |  15 +-
 src/sview/job_info.c                          |  38 +--
 src/sview/node_info.c                         |  32 ++-
 src/sview/part_info.c                         |  35 ++-
 src/sview/resv_info.c                         | 105 ++++++--
 src/sview/sview.c                             |  34 +++
 src/sview/sview.h                             |   8 +-
 32 files changed, 540 insertions(+), 455 deletions(-)

diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in
index 9454611124a..668b59b6088 100644
--- a/slurm/slurm.h.in
+++ b/slurm/slurm.h.in
@@ -1206,11 +1206,11 @@ extern int slurm_load_block_info PARAMS(
 /*
  * slurm_free_block_info_msg - free buffer returned by
  *	slurm_load_block
- * IN block_info_msg_pptr - data is freed and pointer is set to NULL
+ * IN block_info_msg_ptr - pointer to block_info_msg_t
  * RET 0 or a slurm error code
  */
-extern int slurm_free_block_info_msg PARAMS(
-	(block_info_msg_t **block_info_msg_pptr));
+extern void slurm_free_block_info_msg PARAMS(
+	(block_info_msg_t *block_info_msg));
 
 /* update state or remove block */
 extern int slurm_update_block PARAMS((update_block_msg_t *block_msg));
diff --git a/slurm/slurmdb.h b/slurm/slurmdb.h
index 5492bff6c2b..23f62bbc418 100644
--- a/slurm/slurmdb.h
+++ b/slurm/slurmdb.h
@@ -155,6 +155,7 @@ typedef enum {
 #define CLUSTER_FLAG_AIX    0x00000040 /* This is an aix cluster */
 #define CLUSTER_FLAG_MULTSD 0x00000080 /* This cluster is multiple slurmd */
 #define CLUSTER_FLAG_CRAYXT 0x00000100 /* This cluster is a cray XT */
+#define CLUSTER_FLAG_FE     0x00000200 /* This cluster is a front end system */
 
 /* Define assoc_mgr_association_usage_t below to avoid including
  * extraneous slurmdb headers */
diff --git a/src/api/block_info.c b/src/api/block_info.c
index 59cc25ce4af..c0186dbbf4a 100644
--- a/src/api/block_info.c
+++ b/src/api/block_info.c
@@ -242,11 +242,6 @@ extern int slurm_load_block_info (
         return SLURM_SUCCESS;
 }
 
-extern int slurm_free_block_info_msg(block_info_msg_t **block_info_msg_pptr)
-{
-	return node_select_block_info_msg_free(block_info_msg_pptr);
-}
-
 extern int slurm_get_select_jobinfo(dynamic_plugin_data_t *jobinfo,
 				    enum select_jobdata_type data_type,
 				    void *data)
diff --git a/src/common/job_resources.c b/src/common/job_resources.c
index da6f5828507..6daa8431a39 100644
--- a/src/common/job_resources.c
+++ b/src/common/job_resources.c
@@ -529,6 +529,8 @@ extern void log_job_resources(uint32_t job_id,
 extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			       uint16_t protocol_version)
 {
+	uint32_t cluster_flags = slurmdb_setup_cluster_flags();
+
 	if(protocol_version >= SLURM_2_2_PROTOCOL_VERSION) {
 		if (job_resrcs_ptr == NULL) {
 			uint32_t empty = NO_VAL;
@@ -553,7 +555,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			pack16_array(job_resrcs_ptr->cpu_array_value,
 				     job_resrcs_ptr->cpu_array_cnt, buffer);
 		else
-			pack16_array(job_resrcs_ptr->cpu_array_value, 0, buffer);
+			pack16_array(job_resrcs_ptr->cpu_array_value,
+				     0, buffer);
 
 		if (job_resrcs_ptr->cpus)
 			pack16_array(job_resrcs_ptr->cpus,
@@ -571,15 +574,15 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			pack32_array(job_resrcs_ptr->memory_allocated,
 				     job_resrcs_ptr->nhosts, buffer);
 		else
-			pack32_array(job_resrcs_ptr->memory_allocated, 0, buffer);
+			pack32_array(job_resrcs_ptr->memory_allocated,
+				     0, buffer);
 
 		if (job_resrcs_ptr->memory_used)
 			pack32_array(job_resrcs_ptr->memory_used,
 				     job_resrcs_ptr->nhosts, buffer);
 		else
 			pack32_array(job_resrcs_ptr->memory_used, 0, buffer);
-#ifndef HAVE_BG
-		{
+		if(!(cluster_flags & CLUSTER_FLAG_BG)) {
 			int i;
 			uint32_t core_cnt = 0, sock_recs = 0;
 			xassert(job_resrcs_ptr->cores_per_socket);
@@ -587,8 +590,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			xassert(job_resrcs_ptr->sockets_per_node);
 
 			for (i=0; i<job_resrcs_ptr->nhosts; i++) {
-				core_cnt += job_resrcs_ptr->sockets_per_node[i] *
-					job_resrcs_ptr->cores_per_socket[i] *
+				core_cnt += job_resrcs_ptr->sockets_per_node[i]
+					* job_resrcs_ptr->cores_per_socket[i] *
 					job_resrcs_ptr->sock_core_rep_count[i];
 				sock_recs += job_resrcs_ptr->
 					     sock_core_rep_count[i];
@@ -608,8 +611,7 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			pack_bit_str(job_resrcs_ptr->core_bitmap, buffer);
 			pack_bit_str(job_resrcs_ptr->core_bitmap_used, buffer);
 		}
-#endif
-	} else {
+       	} else {
 		if (job_resrcs_ptr == NULL) {
 			uint32_t empty = NO_VAL;
 			pack32(empty, buffer);
@@ -632,7 +634,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			pack16_array(job_resrcs_ptr->cpu_array_value,
 				     job_resrcs_ptr->cpu_array_cnt, buffer);
 		else
-			pack16_array(job_resrcs_ptr->cpu_array_value, 0, buffer);
+			pack16_array(job_resrcs_ptr->cpu_array_value,
+				     0, buffer);
 
 		if (job_resrcs_ptr->cpus)
 			pack16_array(job_resrcs_ptr->cpus,
@@ -650,7 +653,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			pack32_array(job_resrcs_ptr->memory_allocated,
 				     job_resrcs_ptr->nhosts, buffer);
 		else
-			pack32_array(job_resrcs_ptr->memory_allocated, 0, buffer);
+			pack32_array(job_resrcs_ptr->memory_allocated,
+				     0, buffer);
 
 		if (job_resrcs_ptr->memory_used)
 			pack32_array(job_resrcs_ptr->memory_used,
@@ -667,8 +671,8 @@ extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer,
 			xassert(job_resrcs_ptr->sockets_per_node);
 
 			for (i=0; i<job_resrcs_ptr->nhosts; i++) {
-				core_cnt += job_resrcs_ptr->sockets_per_node[i] *
-					job_resrcs_ptr->cores_per_socket[i] *
+				core_cnt += job_resrcs_ptr->sockets_per_node[i]
+					* job_resrcs_ptr->cores_per_socket[i] *
 					job_resrcs_ptr->sock_core_rep_count[i];
 				sock_recs += job_resrcs_ptr->
 					     sock_core_rep_count[i];
@@ -698,6 +702,7 @@ extern int unpack_job_resources(job_resources_t **job_resrcs_pptr,
 	char *bit_fmt = NULL;
 	uint32_t empty, tmp32;
 	job_resources_t *job_resrcs;
+	uint32_t cluster_flags = slurmdb_setup_cluster_flags();
 
 	xassert(job_resrcs_pptr);
 	if(protocol_version >= SLURM_2_2_PROTOCOL_VERSION) {
@@ -744,23 +749,23 @@ extern int unpack_job_resources(job_resources_t **job_resrcs_pptr,
 		if (tmp32 == 0)
 			xfree(job_resrcs->memory_used);
 
-#ifndef HAVE_BG
-		safe_unpack16_array(&job_resrcs->sockets_per_node,
-				    &tmp32, buffer);
-		if (tmp32 == 0)
-			xfree(job_resrcs->sockets_per_node);
-		safe_unpack16_array(&job_resrcs->cores_per_socket,
-				    &tmp32, buffer);
-		if (tmp32 == 0)
-			xfree(job_resrcs->cores_per_socket);
-		safe_unpack32_array(&job_resrcs->sock_core_rep_count,
-				    &tmp32, buffer);
-		if (tmp32 == 0)
-			xfree(job_resrcs->sock_core_rep_count);
-
-		unpack_bit_str(&job_resrcs->core_bitmap, buffer);
-		unpack_bit_str(&job_resrcs->core_bitmap_used, buffer);
-#endif
+		if(!(cluster_flags & CLUSTER_FLAG_BG)) {
+			safe_unpack16_array(&job_resrcs->sockets_per_node,
+					    &tmp32, buffer);
+			if (tmp32 == 0)
+				xfree(job_resrcs->sockets_per_node);
+			safe_unpack16_array(&job_resrcs->cores_per_socket,
+					    &tmp32, buffer);
+			if (tmp32 == 0)
+				xfree(job_resrcs->cores_per_socket);
+			safe_unpack32_array(&job_resrcs->sock_core_rep_count,
+					    &tmp32, buffer);
+			if (tmp32 == 0)
+				xfree(job_resrcs->sock_core_rep_count);
+
+			unpack_bit_str(&job_resrcs->core_bitmap, buffer);
+			unpack_bit_str(&job_resrcs->core_bitmap_used, buffer);
+		}
 	} else {
 		safe_unpack32(&empty, buffer);
 		if (empty == NO_VAL) {
diff --git a/src/common/node_select.c b/src/common/node_select.c
index b89e2fc95a2..0522fc2bc5f 100644
--- a/src/common/node_select.c
+++ b/src/common/node_select.c
@@ -300,247 +300,6 @@ static int _select_context_destroy( slurm_select_context_t *c )
 	return rc;
 }
 
-static void _free_block_info(block_info_t *block_info)
-{
-	if(block_info) {
-		xfree(block_info->bg_block_id);
-		xfree(block_info->blrtsimage);
-		xfree(block_info->bp_inx);
-		xfree(block_info->ionodes);
-		xfree(block_info->ionode_inx);
-		xfree(block_info->linuximage);
-		xfree(block_info->mloaderimage);
-		xfree(block_info->nodes);
-		xfree(block_info->owner_name);
-		xfree(block_info->ramdiskimage);
-	}
-}
-
-/* NOTE: The matching pack functions are directly in the select/bluegene
- * plugin. The unpack functions can not be there since the plugin is
- * dependent upon libraries which do not exist on the BlueGene front-end
- * nodes. */
-static int _unpack_block_info(block_info_t *block_info, Buf buffer,
-			      uint16_t protocol_version)
-{
-	uint32_t uint32_tmp;
-	char *bp_inx_str = NULL;
-
-	if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) {
-		safe_unpackstr_xmalloc(&block_info->bg_block_id,
-				       &uint32_tmp, buffer);
-		if(working_cluster_rec) {
-			if(working_cluster_rec->flags & CLUSTER_FLAG_BGL)
-				safe_unpackstr_xmalloc(&block_info->blrtsimage,
-						       &uint32_tmp, buffer);
-		} else {
-#ifdef HAVE_BGL
-			safe_unpackstr_xmalloc(&block_info->blrtsimage,
-					       &uint32_tmp, buffer);
-#endif
-		}
-		safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer);
-		if (bp_inx_str == NULL) {
-			block_info->bp_inx = bitfmt2int("");
-		} else {
-			block_info->bp_inx = bitfmt2int(bp_inx_str);
-			xfree(bp_inx_str);
-		}
-		safe_unpack16(&block_info->conn_type, buffer);
-		safe_unpackstr_xmalloc(&(block_info->ionodes),
-				       &uint32_tmp, buffer);
-		safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer);
-		if (bp_inx_str == NULL) {
-			block_info->ionode_inx = bitfmt2int("");
-		} else {
-			block_info->ionode_inx = bitfmt2int(bp_inx_str);
-			xfree(bp_inx_str);
-		}
-		safe_unpack32(&block_info->job_running, buffer);
-		safe_unpackstr_xmalloc(&block_info->linuximage,
-				       &uint32_tmp, buffer);
-		safe_unpackstr_xmalloc(&block_info->mloaderimage,
-				       &uint32_tmp, buffer);
-		safe_unpackstr_xmalloc(&(block_info->nodes), &uint32_tmp,
-				       buffer);
-		safe_unpack32(&block_info->node_cnt, buffer);
-		if(working_cluster_rec) {
-			if(working_cluster_rec->flags & CLUSTER_FLAG_BGL)
-				safe_unpack16(&block_info->node_use, buffer);
-		} else {
-#ifdef HAVE_BGL
-			safe_unpack16(&block_info->node_use, buffer);
-#endif
-		}
-		safe_unpackstr_xmalloc(&block_info->owner_name,
-				       &uint32_tmp, buffer);
-		safe_unpackstr_xmalloc(&block_info->ramdiskimage,
-				       &uint32_tmp, buffer);
-		safe_unpack16(&block_info->state, buffer);
-	}
-	return SLURM_SUCCESS;
-
-unpack_error:
-	error("_unpack_node_info: error unpacking here");
-	_free_block_info(block_info);
-	return SLURM_ERROR;
-}
-
-extern int node_select_free_block_info(block_info_t *block_info)
-{
-	if(block_info) {
-		_free_block_info(block_info);
-		xfree(block_info);
-	}
-	return SLURM_SUCCESS;
-}
-
-extern void node_select_pack_block_info(block_info_t *block_info, Buf buffer,
-					uint16_t protocol_version)
-{
-	if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) {
-		if(!block_info) {
-			packnull(buffer);
-			if(working_cluster_rec) {
-				if(working_cluster_rec->flags
-				   & CLUSTER_FLAG_BGL)
-					packnull(buffer);
-			} else {
-#ifdef HAVE_BGL
-				packnull(buffer);
-#endif
-			}
-			pack16((uint16_t)NO_VAL, buffer);
-			packnull(buffer);
-
-			packnull(buffer);
-			packnull(buffer);
-
-			pack32(NO_VAL, buffer);
-
-			packnull(buffer);
-			packnull(buffer);
-			packnull(buffer);
-			pack32(NO_VAL, buffer);
-			if(working_cluster_rec) {
-				if(working_cluster_rec->flags
-				   & CLUSTER_FLAG_BGL)
-					pack16((uint16_t)NO_VAL, buffer);
-			} else {
-#ifdef HAVE_BGL
-				pack16((uint16_t)NO_VAL, buffer);
-#endif
-			}
-			packnull(buffer);
-			packnull(buffer);
-			pack16((uint16_t)NO_VAL, buffer);
-		} else {
-			packstr(block_info->bg_block_id, buffer);
-#ifdef HAVE_BGL
-			packstr(block_info->blrtsimage, buffer);
-#endif
-
-			if(block_info->bp_inx) {
-				char *bitfmt = inx2bitfmt(block_info->bp_inx);
-				packstr(bitfmt, buffer);
-				xfree(bitfmt);
-			} else
-				packnull(buffer);
-
-			pack16(block_info->conn_type, buffer);
-
-			packstr(block_info->ionodes, buffer);
-
-			if(block_info->ionode_inx) {
-				char *bitfmt =
-					inx2bitfmt(block_info->ionode_inx);
-				packstr(bitfmt, buffer);
-				xfree(bitfmt);
-			} else
-				packnull(buffer);
-
-			pack32(block_info->job_running, buffer);
-
-			packstr(block_info->linuximage, buffer);
-			packstr(block_info->mloaderimage, buffer);
-			packstr(block_info->nodes, buffer);
-			pack32(block_info->node_cnt, buffer);
-#ifdef HAVE_BGL
-			pack16(block_info->node_use, buffer);
-#endif
-			packstr(block_info->owner_name, buffer);
-			packstr(block_info->ramdiskimage, buffer);
-			pack16(block_info->state, buffer);
-		}
-	}
-}
-
-extern int node_select_unpack_block_info(block_info_t **block_info, Buf buffer,
-					 uint16_t protocol_version)
-{
-        int rc = SLURM_SUCCESS;
-	block_info_t *bg_rec = xmalloc(sizeof(block_info_t));
-
-	if((rc = _unpack_block_info(bg_rec, buffer, protocol_version))
-	   != SLURM_SUCCESS)
-		xfree(bg_rec);
-	else
-		*block_info = bg_rec;
-	return rc;
-}
-
-extern int node_select_block_info_msg_free (
-	block_info_msg_t **block_info_msg_pptr)
-{
-	block_info_msg_t *block_info_msg = NULL;
-
-	if (block_info_msg_pptr == NULL)
-		return EINVAL;
-
-	block_info_msg = *block_info_msg_pptr;
-	if (block_info_msg->block_array) {
-		int i;
-		for(i=0; i<block_info_msg->record_count; i++)
-			_free_block_info(
-				&(block_info_msg->block_array[i]));
-		xfree(block_info_msg->block_array);
-	}
-	xfree(block_info_msg);
-
-	*block_info_msg_pptr = NULL;
-	return SLURM_SUCCESS;
-}
-
-/* Unpack node select info from a buffer */
-extern int node_select_block_info_msg_unpack(
-	block_info_msg_t **block_info_msg_pptr, Buf buffer,
-	uint16_t protocol_version)
-{
-	int i;
-	block_info_msg_t *buf;
-
-	buf = xmalloc(sizeof(block_info_msg_t));
-	if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) {
-		safe_unpack32(&(buf->record_count), buffer);
-		safe_unpack_time(&(buf->last_update), buffer);
-		buf->block_array = xmalloc(sizeof(block_info_t) *
-					   buf->record_count);
-		for(i=0; i<buf->record_count; i++) {
-			if (_unpack_block_info(&(buf->block_array[i]), buffer,
-					       protocol_version))
-				goto unpack_error;
-		}
-	}
-	*block_info_msg_pptr = buf;
-	return SLURM_SUCCESS;
-
-unpack_error:
-	node_select_block_info_msg_free(&buf);
-	*block_info_msg_pptr = NULL;
-	return SLURM_ERROR;
-}
-
-
 /*
  * Initialize context for node selection plugin
  */
diff --git a/src/common/node_select.h b/src/common/node_select.h
index e83d5a8de2c..cbb2cfe6c02 100644
--- a/src/common/node_select.h
+++ b/src/common/node_select.h
@@ -71,20 +71,6 @@ extern void node_select_pack_block_info(block_info_t *block_info, Buf buffer,
 extern int node_select_unpack_block_info(block_info_t **block_info, Buf buffer,
 					 uint16_t protocol_version);
 
-/*
- * node_select_block_info_msg_free - free buffer returned by
- *	slurm_load_node_select
- * IN block_info_msg_pptr - data is freed and pointer is set to NULL
- * RET 0 or a slurm error code
- */
-extern int node_select_block_info_msg_free (
-	block_info_msg_t **block_info_msg_pptr);
-
-/* Unpack node select info from a buffer */
-extern int node_select_block_info_msg_unpack(
-	block_info_msg_t **block_info_msg_pptr, Buf buffer,
-	uint16_t protocol_version);
-
 /*
  * Initialize context for node selection plugin
  */
diff --git a/src/common/slurm_protocol_defs.c b/src/common/slurm_protocol_defs.c
index d936ca82d04..b059e1c01a4 100644
--- a/src/common/slurm_protocol_defs.c
+++ b/src/common/slurm_protocol_defs.c
@@ -1871,6 +1871,44 @@ extern void slurm_free_stat_jobacct_msg(stat_jobacct_msg_t *msg)
 	}
 }
 
+extern void slurm_free_block_info_members(block_info_t *block_info)
+{
+	if(block_info) {
+		xfree(block_info->bg_block_id);
+		xfree(block_info->blrtsimage);
+		xfree(block_info->bp_inx);
+		xfree(block_info->ionodes);
+		xfree(block_info->ionode_inx);
+		xfree(block_info->linuximage);
+		xfree(block_info->mloaderimage);
+		xfree(block_info->nodes);
+		xfree(block_info->owner_name);
+		xfree(block_info->ramdiskimage);
+	}
+}
+
+extern void slurm_free_block_info(block_info_t *block_info)
+{
+	if(block_info) {
+		slurm_free_block_info_members(block_info);
+		xfree(block_info);
+	}
+}
+
+extern void slurm_free_block_info_msg(block_info_msg_t *block_info_msg)
+{
+	if(block_info_msg) {
+		if (block_info_msg->block_array) {
+			int i;
+			for(i=0; i<block_info_msg->record_count; i++)
+				slurm_free_block_info_members(
+					&(block_info_msg->block_array[i]));
+			xfree(block_info_msg->block_array);
+		}
+		xfree(block_info_msg);
+	}
+}
+
 void inline slurm_free_block_info_request_msg(
 	block_info_request_msg_t *msg)
 {
diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h
index 6dd5924183e..43d06b125fb 100644
--- a/src/common/slurm_protocol_defs.h
+++ b/src/common/slurm_protocol_defs.h
@@ -1041,6 +1041,9 @@ void slurm_free_topo_info_msg(topo_info_response_msg_t *msg);
 void inline slurm_free_file_bcast_msg(file_bcast_msg_t *msg);
 void inline slurm_free_step_complete_msg(step_complete_msg_t *msg);
 void inline slurm_free_stat_jobacct_msg(stat_jobacct_msg_t *msg);
+void slurm_free_block_info_members(block_info_t *block_info);
+void slurm_free_block_info(block_info_t *block_info);
+void slurm_free_block_info_msg(block_info_msg_t *block_info_msg);
 void inline slurm_free_block_info_request_msg(
 		block_info_request_msg_t *msg);
 void inline slurm_free_job_notify_msg(job_notify_msg_t * msg);
diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index 00b61d3a55f..f90a47bd1dd 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -68,7 +68,7 @@
 
 #define _pack_job_info_msg(msg,buf)		_pack_buffer_msg(msg,buf)
 #define _pack_job_step_info_msg(msg,buf)	_pack_buffer_msg(msg,buf)
-#define _pack_block_info_msg(msg,buf)		_pack_buffer_msg(msg,buf)
+#define _pack_block_info_resp_msg(msg,buf)	_pack_buffer_msg(msg,buf)
 #define _pack_node_info_msg(msg,buf)		_pack_buffer_msg(msg,buf)
 #define _pack_partition_info_msg(msg,buf)	_pack_buffer_msg(msg,buf)
 #define _pack_reserve_info_msg(msg,buf)		_pack_buffer_msg(msg,buf)
@@ -311,6 +311,10 @@ static void _pack_block_info_req_msg(block_info_request_msg_t *
 static int _unpack_block_info_req_msg(block_info_request_msg_t **
 				      msg, Buf buffer,
 				      uint16_t protocol_version);
+static void _pack_block_info_msg(block_info_t *block_info, Buf buffer,
+				 uint16_t protocol_version);
+extern int _unpack_block_info(block_info_t **block_info, Buf buffer,
+			      uint16_t protocol_version);
 
 static void _pack_job_step_info_req_msg(job_step_info_request_msg_t * msg,
 					Buf buffer,
@@ -773,8 +777,8 @@ pack_msg(slurm_msg_t const *msg, Buf buffer)
 				    msg->protocol_version);
 		break;
 	case REQUEST_UPDATE_BLOCK:
-		node_select_pack_block_info((block_info_t *)msg->data, buffer,
-					    msg->protocol_version);
+		_pack_block_info_msg((block_info_t *)msg->data, buffer,
+				     msg->protocol_version);
 		break;
 	case REQUEST_REATTACH_TASKS:
 		_pack_reattach_tasks_request_msg(
@@ -1023,7 +1027,7 @@ pack_msg(slurm_msg_t const *msg, Buf buffer)
 			msg->protocol_version);
 		break;
 	case RESPONSE_BLOCK_INFO:
-		_pack_block_info_msg((slurm_msg_t *) msg, buffer);
+		_pack_block_info_resp_msg((slurm_msg_t *) msg, buffer);
 		break;
 	case REQUEST_FILE_BCAST:
 		_pack_file_bcast((file_bcast_msg_t *) msg->data, buffer,
@@ -1240,7 +1244,7 @@ unpack_msg(slurm_msg_t * msg, Buf buffer)
 					   msg->protocol_version);
 		break;
 	case REQUEST_UPDATE_BLOCK:
-		rc = node_select_unpack_block_info(
+		rc = _unpack_block_info(
 			(block_info_t **)&(msg->data), buffer,
 			msg->protocol_version);
 		break;
@@ -1519,7 +1523,7 @@ unpack_msg(slurm_msg_t * msg, Buf buffer)
 			msg->protocol_version);
 		break;
 	case RESPONSE_BLOCK_INFO:
-		rc = node_select_block_info_msg_unpack(
+		rc = slurm_unpack_block_info_msg(
 			(block_info_msg_t **) &(msg->data), buffer,
 			msg->protocol_version);
 		break;
@@ -6366,6 +6370,172 @@ unpack_error:
 	return SLURM_ERROR;
 }
 
+/* NOTE: The matching pack functions are directly in the select/bluegene
+ * plugin. The unpack functions can not be there since the plugin is
+ * dependent upon libraries which do not exist on the BlueGene front-end
+ * nodes. */
+static int _unpack_block_info_members(block_info_t *block_info, Buf buffer,
+				      uint16_t protocol_version)
+{
+	uint32_t uint32_tmp;
+	char *bp_inx_str = NULL;
+	uint32_t cluster_flags = slurmdb_setup_cluster_flags();
+
+	if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) {
+		safe_unpackstr_xmalloc(&block_info->bg_block_id,
+				       &uint32_tmp, buffer);
+		if(cluster_flags & CLUSTER_FLAG_BGL)
+			safe_unpackstr_xmalloc(&block_info->blrtsimage,
+					       &uint32_tmp, buffer);
+		safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer);
+		if (bp_inx_str == NULL) {
+			block_info->bp_inx = bitfmt2int("");
+		} else {
+			block_info->bp_inx = bitfmt2int(bp_inx_str);
+			xfree(bp_inx_str);
+		}
+		safe_unpack16(&block_info->conn_type, buffer);
+		safe_unpackstr_xmalloc(&(block_info->ionodes),
+				       &uint32_tmp, buffer);
+		safe_unpackstr_xmalloc(&bp_inx_str, &uint32_tmp, buffer);
+		if (bp_inx_str == NULL) {
+			block_info->ionode_inx = bitfmt2int("");
+		} else {
+			block_info->ionode_inx = bitfmt2int(bp_inx_str);
+			xfree(bp_inx_str);
+		}
+		safe_unpack32(&block_info->job_running, buffer);
+		safe_unpackstr_xmalloc(&block_info->linuximage,
+				       &uint32_tmp, buffer);
+		safe_unpackstr_xmalloc(&block_info->mloaderimage,
+				       &uint32_tmp, buffer);
+		safe_unpackstr_xmalloc(&(block_info->nodes), &uint32_tmp,
+				       buffer);
+		safe_unpack32(&block_info->node_cnt, buffer);
+		if(cluster_flags & CLUSTER_FLAG_BGL)
+			safe_unpack16(&block_info->node_use, buffer);
+		safe_unpackstr_xmalloc(&block_info->owner_name,
+				       &uint32_tmp, buffer);
+		safe_unpackstr_xmalloc(&block_info->ramdiskimage,
+				       &uint32_tmp, buffer);
+		safe_unpack16(&block_info->state, buffer);
+	}
+	return SLURM_SUCCESS;
+
+unpack_error:
+	error("_unpack_node_info: error unpacking here");
+	slurm_free_block_info_members(block_info);
+	return SLURM_ERROR;
+}
+
+static void _pack_block_info_msg(block_info_t *block_info, Buf buffer,
+				 uint16_t protocol_version)
+{
+	uint32_t cluster_flags = slurmdb_setup_cluster_flags();
+	if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) {
+		if(!block_info) {
+			packnull(buffer);
+			if(cluster_flags & CLUSTER_FLAG_BGL)
+				packnull(buffer);
+			pack16((uint16_t)NO_VAL, buffer);
+			packnull(buffer);
+
+			packnull(buffer);
+			packnull(buffer);
+
+			pack32(NO_VAL, buffer);
+
+			packnull(buffer);
+			packnull(buffer);
+			packnull(buffer);
+			pack32(NO_VAL, buffer);
+			if(cluster_flags & CLUSTER_FLAG_BGL)
+				pack16((uint16_t)NO_VAL, buffer);
+			packnull(buffer);
+			packnull(buffer);
+			pack16((uint16_t)NO_VAL, buffer);
+		} else {
+			packstr(block_info->bg_block_id, buffer);
+			if(cluster_flags & CLUSTER_FLAG_BGL)
+				packstr(block_info->blrtsimage, buffer);
+
+			if(block_info->bp_inx) {
+				char *bitfmt = inx2bitfmt(block_info->bp_inx);
+				packstr(bitfmt, buffer);
+				xfree(bitfmt);
+			} else
+				packnull(buffer);
+
+			pack16(block_info->conn_type, buffer);
+
+			packstr(block_info->ionodes, buffer);
+
+			if(block_info->ionode_inx) {
+				char *bitfmt =
+					inx2bitfmt(block_info->ionode_inx);
+				packstr(bitfmt, buffer);
+				xfree(bitfmt);
+			} else
+				packnull(buffer);
+
+			pack32(block_info->job_running, buffer);
+
+			packstr(block_info->linuximage, buffer);
+			packstr(block_info->mloaderimage, buffer);
+			packstr(block_info->nodes, buffer);
+			pack32(block_info->node_cnt, buffer);
+			if(cluster_flags & CLUSTER_FLAG_BGL)
+				pack16(block_info->node_use, buffer);
+			packstr(block_info->owner_name, buffer);
+			packstr(block_info->ramdiskimage, buffer);
+			pack16(block_info->state, buffer);
+		}
+	}
+}
+
+extern int slurm_unpack_block_info_msg(
+	block_info_msg_t **block_info_msg_pptr, Buf buffer,
+	uint16_t protocol_version)
+{
+	int i;
+	block_info_msg_t *buf;
+
+	buf = xmalloc(sizeof(block_info_msg_t));
+	if(protocol_version >= SLURM_2_1_PROTOCOL_VERSION) {
+		safe_unpack32(&(buf->record_count), buffer);
+		safe_unpack_time(&(buf->last_update), buffer);
+		buf->block_array = xmalloc(sizeof(block_info_t) *
+					   buf->record_count);
+		for(i=0; i<buf->record_count; i++) {
+			if (_unpack_block_info_members(
+				    &(buf->block_array[i]), buffer,
+				    protocol_version))
+				goto unpack_error;
+		}
+	}
+	*block_info_msg_pptr = buf;
+	return SLURM_SUCCESS;
+
+unpack_error:
+	slurm_free_block_info_msg(buf);
+	*block_info_msg_pptr = NULL;
+	return SLURM_ERROR;
+}
+
+extern int _unpack_block_info(block_info_t **block_info, Buf buffer,
+			      uint16_t protocol_version)
+{
+        int rc = SLURM_SUCCESS;
+	block_info_t *bg_rec = xmalloc(sizeof(block_info_t));
+
+	if((rc = _unpack_block_info_members(bg_rec, buffer, protocol_version))
+	   != SLURM_SUCCESS)
+		xfree(bg_rec);
+	else
+		*block_info = bg_rec;
+	return rc;
+}
+
 static void
 _pack_job_step_info_req_msg(job_step_info_request_msg_t * msg, Buf buffer,
 			    uint16_t protocol_version)
diff --git a/src/common/slurm_protocol_pack.h b/src/common/slurm_protocol_pack.h
index 4da59fd29fa..986161e6b4a 100644
--- a/src/common/slurm_protocol_pack.h
+++ b/src/common/slurm_protocol_pack.h
@@ -142,5 +142,7 @@ extern int unpack_msg ( slurm_msg_t * msg , Buf buffer );
 
 extern void pack_multi_core_data (multi_core_data_t *multi_core, Buf buffer);
 extern int unpack_multi_core_data (multi_core_data_t **multi_core, Buf buffer);
-
+extern int slurm_unpack_block_info_msg(
+	block_info_msg_t **block_info_msg_pptr, Buf buffer,
+	uint16_t protocol_version);
 #endif
diff --git a/src/common/slurm_step_layout.c b/src/common/slurm_step_layout.c
index b6e82bbad7d..67478a4212a 100644
--- a/src/common/slurm_step_layout.c
+++ b/src/common/slurm_step_layout.c
@@ -53,6 +53,7 @@
 #include "src/common/read_config.h"
 #include "src/common/slurm_protocol_api.h"
 #include "src/common/node_select.h"
+#include "src/common/slurmdb_defs.h"
 
 /* build maps for task layout on nodes */
 static int _init_task_layout(slurm_step_layout_t *step_layout,
@@ -67,12 +68,8 @@ static int _task_layout_cyclic(slurm_step_layout_t *step_layout,
 			       uint16_t *cpus);
 static int _task_layout_plane(slurm_step_layout_t *step_layout,
 			      uint16_t *cpus);
-#ifndef HAVE_FRONT_END
 static int _task_layout_hostfile(slurm_step_layout_t *step_layout,
 				 const char *arbitrary_nodes);
-#endif
-
-
 
 /*
  * slurm_step_layout_create - determine how many tasks of a job will be
@@ -101,6 +98,7 @@ slurm_step_layout_t *slurm_step_layout_create(
 	char *arbitrary_nodes = NULL;
 	slurm_step_layout_t *step_layout =
 		xmalloc(sizeof(slurm_step_layout_t));
+	uint32_t cluster_flags = slurmdb_setup_cluster_flags();
 
 	step_layout->task_dist = task_dist;
 	if(task_dist == SLURM_DIST_ARBITRARY) {
@@ -120,20 +118,18 @@ slurm_step_layout_t *slurm_step_layout_create(
 	}
 
 	step_layout->task_cnt  = num_tasks;
-
-#ifdef HAVE_FRONT_END	/* Limited job step support */
-	/* All jobs execute through front-end on Blue Gene.
-	 * Normally we would not permit execution of job steps,
-	 * but can fake it by just allocating all tasks to
-	 * one of the allocated nodes. */
-#ifdef HAVE_BG
-	step_layout->node_cnt  = num_hosts;
-#else
-	step_layout->node_cnt  = 1;
-#endif
-#else
-	step_layout->node_cnt  = num_hosts;
-#endif
+	if(cluster_flags & CLUSTER_FLAG_FE) {
+		/* Limited job step support */
+		/* All jobs execute through front-end on Blue Gene.
+		 * Normally we would not permit execution of job steps,
+		 * but can fake it by just allocating all tasks to
+		 * one of the allocated nodes. */
+		if(cluster_flags & CLUSTER_FLAG_BG)
+			step_layout->node_cnt  = num_hosts;
+		else
+			step_layout->node_cnt  = 1;
+	} else
+		step_layout->node_cnt  = num_hosts;
 
 	if(_init_task_layout(step_layout, arbitrary_nodes,
 			     cpus_per_node, cpu_count_reps,
@@ -413,9 +409,8 @@ static int _init_task_layout(slurm_step_layout_t *step_layout,
 			     uint16_t task_dist, uint16_t plane_size)
 {
 	int cpu_cnt = 0, cpu_inx = 0, i;
-#ifndef HAVE_BG
-	hostlist_t hl = NULL;
-#endif
+	uint32_t cluster_flags = slurmdb_setup_cluster_flags();
+
 /* 	char *name = NULL; */
 	uint16_t cpus[step_layout->node_cnt];
 
@@ -433,16 +428,15 @@ static int _init_task_layout(slurm_step_layout_t *step_layout,
 				     * step_layout->node_cnt);
 	step_layout->tids  = xmalloc(sizeof(uint32_t *)
 				     * step_layout->node_cnt);
-
-#ifndef HAVE_BG
-	hl = hostlist_create(step_layout->node_list);
-	/* make sure the number of nodes we think we have
-	 * is the correct number */
-	i = hostlist_count(hl);
-	if(step_layout->node_cnt > i)
-		step_layout->node_cnt = i;
-	hostlist_destroy(hl);
-#endif
+	if(!(cluster_flags & CLUSTER_FLAG_BG)) {
+		hostlist_t hl = hostlist_create(step_layout->node_list);
+		/* make sure the number of nodes we think we have
+		 * is the correct number */
+		i = hostlist_count(hl);
+		if(step_layout->node_cnt > i)
+			step_layout->node_cnt = i;
+		hostlist_destroy(hl);
+	}
 	debug("laying out the %u tasks on %u hosts %s",
 	      step_layout->task_cnt, step_layout->node_cnt,
 	      step_layout->node_list);
@@ -479,17 +473,15 @@ static int _init_task_layout(slurm_step_layout_t *step_layout,
             (task_dist == SLURM_DIST_CYCLIC_CYCLIC) ||
             (task_dist == SLURM_DIST_CYCLIC_BLOCK))
 		return _task_layout_cyclic(step_layout, cpus);
-#ifndef HAVE_FRONT_END
-	else if(task_dist == SLURM_DIST_ARBITRARY)
+	else if(task_dist == SLURM_DIST_ARBITRARY
+		&& !(cluster_flags & CLUSTER_FLAG_FE))
 		return _task_layout_hostfile(step_layout, arbitrary_nodes);
-#endif
         else if(task_dist == SLURM_DIST_PLANE)
                 return _task_layout_plane(step_layout, cpus);
 	else
 		return _task_layout_block(step_layout, cpus);
 }
 
-#ifndef HAVE_FRONT_END
 /* use specific set run tasks on each host listed in hostfile
  * XXX: Need to handle over-subscribe.
  */
@@ -570,7 +562,6 @@ static int _task_layout_hostfile(slurm_step_layout_t *step_layout,
 
 	return SLURM_SUCCESS;
 }
-#endif
 
 /* to effectively deal with heterogeneous nodes, we fake a cyclic
  * distribution to figure out how many tasks go on each node and
diff --git a/src/common/slurmdb_defs.c b/src/common/slurmdb_defs.c
index f63fddf8f97..05c5882b38a 100644
--- a/src/common/slurmdb_defs.c
+++ b/src/common/slurmdb_defs.c
@@ -763,11 +763,14 @@ extern uint16_t slurmdb_setup_cluster_dims()
 
 extern uint32_t slurmdb_setup_cluster_flags()
 {
-	uint32_t cluster_flags = 0;
+	static uint32_t cluster_flags = NO_VAL;
 
 	if(working_cluster_rec)
 		return working_cluster_rec->flags;
+	else if(cluster_flags != NO_VAL)
+		return cluster_flags;
 
+	cluster_flags = 0;
 #ifdef HAVE_BG
 	cluster_flags |= CLUSTER_FLAG_BG;
 #endif
@@ -794,6 +797,9 @@ extern uint32_t slurmdb_setup_cluster_flags()
 #endif
 #ifdef HAVE_CRAY_XT
 	cluster_flags |= CLUSTER_FLAG_CRAYXT;
+#endif
+#ifdef HAVE_FRONT_END
+	cluster_flags |= CLUSTER_FLAG_FE;
 #endif
 	return cluster_flags;
 }
diff --git a/src/plugins/select/bluegene/plugin/block_sys.c b/src/plugins/select/bluegene/plugin/block_sys.c
index fde79dbf660..4cc32321e80 100755
--- a/src/plugins/select/bluegene/plugin/block_sys.c
+++ b/src/plugins/select/bluegene/plugin/block_sys.c
@@ -1031,8 +1031,7 @@ extern int load_state_file(List curr_block_list, char *dir_name)
 		return EFAULT;
 	}
 	xfree(ver_str);
-	if(node_select_block_info_msg_unpack(&block_ptr, buffer,
-					     protocol_version)
+	if(slurm_unpack_block_info_msg(&block_ptr, buffer, protocol_version)
 	   == SLURM_ERROR) {
 		error("select_p_state_restore: problem unpacking block_info");
 		goto unpack_error;
@@ -1060,7 +1059,7 @@ extern int load_state_file(List curr_block_list, char *dir_name)
 		}
 	}
 
-	slurm_free_block_info_msg(&block_ptr);
+	slurm_free_block_info_msg(block_ptr);
 	free_buf(buffer);
 	return SLURM_SUCCESS;
 #endif
@@ -1259,7 +1258,7 @@ extern int load_state_file(List curr_block_list, char *dir_name)
 	slurm_mutex_unlock(&block_state_mutex);
 
 	info("Recovered %d blocks", blocks);
-	node_select_block_info_msg_free(&block_ptr);
+	slurm_free_block_info_msg(block_ptr);
 	free_buf(buffer);
 
 	return SLURM_SUCCESS;
diff --git a/src/plugins/select/bluegene/plugin/sfree.c b/src/plugins/select/bluegene/plugin/sfree.c
index 3a829cffded..966a324d04c 100644
--- a/src/plugins/select/bluegene/plugin/sfree.c
+++ b/src/plugins/select/bluegene/plugin/sfree.c
@@ -61,7 +61,7 @@ static int _get_new_info_block(block_info_msg_t **block_ptr)
 		error_code = slurm_load_block_info(bg_info_ptr->last_update,
 						   &new_bg_ptr);
 		if (error_code == SLURM_SUCCESS) {
-			slurm_free_block_info_msg(&bg_info_ptr);
+			slurm_free_block_info_msg(bg_info_ptr);
 		} else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_NO_CHANGE_IN_DATA;
 			new_bg_ptr = bg_info_ptr;
diff --git a/src/plugins/select/bluegene/plugin/slurm_prolog.c b/src/plugins/select/bluegene/plugin/slurm_prolog.c
index 8d7964d8236..d9ab9c6618a 100644
--- a/src/plugins/select/bluegene/plugin/slurm_prolog.c
+++ b/src/plugins/select/bluegene/plugin/slurm_prolog.c
@@ -193,7 +193,7 @@ static int _partitions_dealloc()
 		error_code = slurm_load_block_info(bg_info_ptr->last_update,
 						   &new_bg_ptr);
 		if (error_code == SLURM_SUCCESS)
-			slurm_free_block_info_msg(&bg_info_ptr);
+			slurm_free_block_info_msg(bg_info_ptr);
 		else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_SUCCESS;
 			new_bg_ptr = bg_info_ptr;
diff --git a/src/salloc/salloc.c b/src/salloc/salloc.c
index 1fbdc34d3ee..eb1debc62a9 100644
--- a/src/salloc/salloc.c
+++ b/src/salloc/salloc.c
@@ -846,7 +846,7 @@ static int _blocks_dealloc(void)
 		error_code = slurm_load_block_info(bg_info_ptr->last_update,
 						   &new_bg_ptr);
 		if (error_code == SLURM_SUCCESS)
-			slurm_free_block_info_msg(&bg_info_ptr);
+			slurm_free_block_info_msg(bg_info_ptr);
 		else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_SUCCESS;
 			new_bg_ptr = bg_info_ptr;
diff --git a/src/scontrol/info_block.c b/src/scontrol/info_block.c
index 1185ce4b871..139c4e09417 100644
--- a/src/scontrol/info_block.c
+++ b/src/scontrol/info_block.c
@@ -49,7 +49,7 @@ scontrol_load_block (block_info_msg_t **block_info_pptr)
 		error_code = slurm_load_block_info(
 			old_block_info_ptr->last_update, &info_ptr);
 		if (error_code == SLURM_SUCCESS)
-			slurm_free_block_info_msg(&old_block_info_ptr);
+			slurm_free_block_info_msg(old_block_info_ptr);
 		else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			info_ptr = old_block_info_ptr;
 			error_code = SLURM_SUCCESS;
diff --git a/src/scontrol/info_job.c b/src/scontrol/info_job.c
index 088fd462ebf..0a1b8b3de11 100644
--- a/src/scontrol/info_job.c
+++ b/src/scontrol/info_job.c
@@ -709,7 +709,7 @@ static int _blocks_dealloc(void)
 		error_code = slurm_load_block_info(bg_info_ptr->last_update,
 						   &new_bg_ptr);
 		if (error_code == SLURM_SUCCESS)
-			slurm_free_block_info_msg(&bg_info_ptr);
+			slurm_free_block_info_msg(bg_info_ptr);
 		else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_SUCCESS;
 			new_bg_ptr = bg_info_ptr;
diff --git a/src/scontrol/scontrol.c b/src/scontrol/scontrol.c
index b4cd788b46e..1ddc3e20f87 100644
--- a/src/scontrol/scontrol.c
+++ b/src/scontrol/scontrol.c
@@ -556,18 +556,30 @@ _process_command (int argc, char *argv[])
 			working_cluster_rec = list_peek(clusters);
 		}
 		cluster_flags = slurmdb_setup_cluster_flags();
-		if(old_block_info_ptr)
-			old_block_info_ptr->last_update = 0;
-		if(old_job_info_ptr)
-			old_job_info_ptr->last_update = 0;
-		if(old_node_info_ptr)
-			old_node_info_ptr->last_update = 0;
-		if(old_part_info_ptr)
-			old_part_info_ptr->last_update = 0;
-		if(old_res_info_ptr)
-			old_res_info_ptr->last_update = 0;
-		if(old_slurm_ctl_conf_ptr)
-			old_slurm_ctl_conf_ptr->last_update = 0;
+		slurm_free_block_info_msg(old_block_info_ptr);
+		old_block_info_ptr = NULL;
+		slurm_free_job_info_msg(old_job_info_ptr);
+		old_job_info_ptr = NULL;
+		slurm_free_node_info_msg(old_node_info_ptr);
+		old_node_info_ptr = NULL;
+		slurm_free_partition_info_msg(old_part_info_ptr);
+		old_part_info_ptr = NULL;
+		slurm_free_reservation_info_msg(old_res_info_ptr);
+		old_res_info_ptr = NULL;
+		slurm_free_ctl_conf(old_slurm_ctl_conf_ptr);
+		old_slurm_ctl_conf_ptr = NULL;
+		/* if(old_block_info_ptr) */
+		/* 	old_block_info_ptr->last_update = 0; */
+		/* if(old_job_info_ptr) */
+		/* 	old_job_info_ptr->last_update = 0; */
+		/* if(old_node_info_ptr) */
+		/* 	old_node_info_ptr->last_update = 0; */
+		/* if(old_part_info_ptr) */
+		/* 	old_part_info_ptr->last_update = 0; */
+		/* if(old_res_info_ptr) */
+		/* 	old_res_info_ptr->last_update = 0; */
+		/* if(old_slurm_ctl_conf_ptr) */
+		/* 	old_slurm_ctl_conf_ptr->last_update = 0; */
 	}
 	else if (strncasecmp (tag, "create", MAX(taglen, 2)) == 0) {
 		if (argc < 2) {
diff --git a/src/sinfo/sinfo.c b/src/sinfo/sinfo.c
index d15b34e25aa..99ffbcdb7f4 100644
--- a/src/sinfo/sinfo.c
+++ b/src/sinfo/sinfo.c
@@ -236,7 +236,7 @@ _query_server(partition_info_msg_t ** part_pptr,
 				old_bg_ptr->last_update,
 				&new_bg_ptr);
 			if (error_code == SLURM_SUCCESS)
-				slurm_free_block_info_msg(&old_bg_ptr);
+				slurm_free_block_info_msg(old_bg_ptr);
 			else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 				error_code = SLURM_SUCCESS;
 				new_bg_ptr = old_bg_ptr;
diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c
index 1e8faad0fc5..b76d21b8b25 100644
--- a/src/slurmctld/proc_req.c
+++ b/src/slurmctld/proc_req.c
@@ -304,7 +304,7 @@ void slurmctld_req (slurm_msg_t * msg)
 		break;
 	case REQUEST_UPDATE_BLOCK:
 		_slurm_rpc_update_block(msg);
-		node_select_free_block_info(msg->data);
+		slurm_free_block_info(msg->data);
 		break;
 	case REQUEST_RESERVATION_INFO:
 		_slurm_rpc_resv_show(msg);
diff --git a/src/smap/partition_functions.c b/src/smap/partition_functions.c
index 544f2ddbd21..0ff569b3147 100644
--- a/src/smap/partition_functions.c
+++ b/src/smap/partition_functions.c
@@ -228,7 +228,7 @@ extern void get_bg_part()
 		error_code = slurm_load_block_info(bg_info_ptr->last_update,
 						   &new_bg_ptr);
 		if (error_code == SLURM_SUCCESS)
-			slurm_free_block_info_msg(&bg_info_ptr);
+			slurm_free_block_info_msg(bg_info_ptr);
 		else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_SUCCESS;
 			new_bg_ptr = bg_info_ptr;
diff --git a/src/srun/allocate.c b/src/srun/allocate.c
index 860f8fb46b0..eac2d12a5d3 100644
--- a/src/srun/allocate.c
+++ b/src/srun/allocate.c
@@ -294,7 +294,7 @@ static int _blocks_dealloc(void)
 		error_code = slurm_load_block_info(bg_info_ptr->last_update,
 						   &new_bg_ptr);
 		if (error_code == SLURM_SUCCESS)
-			slurm_free_block_info_msg(&bg_info_ptr);
+			slurm_free_block_info_msg(bg_info_ptr);
 		else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_SUCCESS;
 			new_bg_ptr = bg_info_ptr;
diff --git a/src/sview/block_info.c b/src/sview/block_info.c
index d3718597da6..3b9ee4ad972 100644
--- a/src/sview/block_info.c
+++ b/src/sview/block_info.c
@@ -104,8 +104,8 @@ static display_data_t display_data_block[] = {
 	{G_TYPE_STRING, SORTID_CONN, "Connection Type",
 	 FALSE, EDIT_NONE, refresh_block,
 	 create_model_block, admin_edit_block},
-	{G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE, EDIT_NONE, refresh_block,
-	 create_model_block, admin_edit_block},
+	{G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE,
+	 EDIT_NONE, refresh_block, create_model_block, admin_edit_block},
 	{G_TYPE_STRING, SORTID_PARTITION, "Partition",
 	 TRUE, EDIT_NONE, refresh_block,
 	 create_model_block, admin_edit_block},
@@ -492,10 +492,10 @@ static List _create_block_list(partition_info_msg_t *part_info_ptr,
 		return block_list;
 	}
 
-	if(block_list) {
-		list_destroy(block_list);
-	}
-	block_list = list_create(_block_list_del);
+	if(block_list)
+		list_flush(block_list);
+	else
+		block_list = list_create(_block_list_del);
 	if (!block_list) {
 		g_print("malloc error\n");
 		return NULL;
@@ -694,7 +694,6 @@ extern void refresh_block(GtkAction *action, gpointer user_data)
 extern int get_new_info_block(block_info_msg_t **block_ptr, int force)
 {
 	int error_code = SLURM_NO_CHANGE_IN_DATA;
-	static block_info_msg_t *bg_info_ptr = NULL;
 	static block_info_msg_t *new_bg_ptr = NULL;
 	time_t now = time(NULL);
 	static time_t last;
@@ -704,23 +703,23 @@ extern int get_new_info_block(block_info_msg_t **block_ptr, int force)
 		return error_code;
 
 	if(!force && ((now - last) < working_sview_config.refresh_delay)) {
-		if(*block_ptr != bg_info_ptr)
+		if(*block_ptr != g_block_info_ptr)
 			error_code = SLURM_SUCCESS;
-		*block_ptr = bg_info_ptr;
+		*block_ptr = g_block_info_ptr;
 		if(changed)
 			return SLURM_SUCCESS;
 		return error_code;
 	}
 	last = now;
-	if (bg_info_ptr) {
-		error_code = slurm_load_block_info(bg_info_ptr->last_update,
-						   &new_bg_ptr);
+	if (g_block_info_ptr) {
+		error_code = slurm_load_block_info(
+			g_block_info_ptr->last_update, &new_bg_ptr);
 		if (error_code == SLURM_SUCCESS) {
-			slurm_free_block_info_msg(&bg_info_ptr);
+			slurm_free_block_info_msg(g_block_info_ptr);
 			changed = 1;
 		} else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_NO_CHANGE_IN_DATA;
-			new_bg_ptr = bg_info_ptr;
+			new_bg_ptr = g_block_info_ptr;
 			changed = 0;
 		}
 	} else {
@@ -729,9 +728,9 @@ extern int get_new_info_block(block_info_msg_t **block_ptr, int force)
 		changed = 1;
 	}
 
-	bg_info_ptr = new_bg_ptr;
+	g_block_info_ptr = new_bg_ptr;
 	if(block_ptr) {
-		if(*block_ptr != bg_info_ptr)
+		if(*block_ptr != g_block_info_ptr)
 			error_code = SLURM_SUCCESS;
 
 		*block_ptr = new_bg_ptr;
@@ -898,8 +897,6 @@ extern void get_info_block(GtkTable *table, display_data_t *display_data)
 		if(display_widget)
 			gtk_widget_destroy(display_widget);
 		display_widget = NULL;
-		get_new_info_part(&part_info_ptr, true);
-		get_new_info_block(&block_ptr, true);
 		return;
 	}
 
diff --git a/src/sview/common.c b/src/sview/common.c
index 7f777017dd9..99070d159a1 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -59,12 +59,6 @@ static gboolean _menu_button_released(GtkWidget *widget, GdkEventButton *event,
 	return false;
 }
 
-static gboolean _entry_changed(GtkWidget *widget, void *msg)
-{
-	global_entry_changed = 1;
-	return false;
-}
-
 static void _handle_response(GtkDialog *dialog, gint response_id,
 			     popup_info_t *popup_win)
 {
diff --git a/src/sview/config_info.c b/src/sview/config_info.c
index ceacbdad25a..3d00f35e851 100644
--- a/src/sview/config_info.c
+++ b/src/sview/config_info.c
@@ -41,24 +41,23 @@
 
 extern int get_new_info_config(slurm_ctl_conf_info_msg_t **info_ptr)
 {
-	static slurm_ctl_conf_info_msg_t *ctl_info_ptr = NULL,
-		*new_ctl_ptr = NULL;
+	static slurm_ctl_conf_info_msg_t *new_ctl_ptr = NULL;
 	int error_code = SLURM_NO_CHANGE_IN_DATA;
 
-	if (ctl_info_ptr) {
-		error_code = slurm_load_ctl_conf(ctl_info_ptr->last_update,
+	if (g_ctl_info_ptr) {
+		error_code = slurm_load_ctl_conf(g_ctl_info_ptr->last_update,
 						 &new_ctl_ptr);
 		if (error_code == SLURM_SUCCESS)
-			slurm_free_ctl_conf(ctl_info_ptr);
+			slurm_free_ctl_conf(g_ctl_info_ptr);
 		else if (slurm_get_errno () == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_NO_CHANGE_IN_DATA;
-			new_ctl_ptr = ctl_info_ptr;
+			new_ctl_ptr = g_ctl_info_ptr;
 		}
 	} else
 		error_code = slurm_load_ctl_conf((time_t) NULL, &new_ctl_ptr);
-	ctl_info_ptr = new_ctl_ptr;
+	g_ctl_info_ptr = new_ctl_ptr;
 
-	if(*info_ptr != ctl_info_ptr)
+	if(*info_ptr != g_ctl_info_ptr)
 		error_code = SLURM_SUCCESS;
 
 	*info_ptr = new_ctl_ptr;
diff --git a/src/sview/job_info.c b/src/sview/job_info.c
index f36d1605c1d..660b08800f3 100644
--- a/src/sview/job_info.c
+++ b/src/sview/job_info.c
@@ -2417,12 +2417,12 @@ static List _create_job_info_list(job_info_msg_t *job_info_ptr,
 	}
 
 	if(info_list) {
-		list_destroy(info_list);
-		list_destroy(odd_info_list);
+		list_flush(info_list);
+		list_flush(odd_info_list);
+	} else {
+		info_list = list_create(NULL);
+		odd_info_list = list_create(_job_info_list_del);
 	}
-
-	info_list = list_create(NULL);
-	odd_info_list = list_create(_job_info_list_del);
 	if (!info_list || !odd_info_list) {
 		g_print("malloc error\n");
 		return NULL;
@@ -2613,7 +2613,7 @@ extern void refresh_job(GtkAction *action, gpointer user_data)
 extern int get_new_info_job(job_info_msg_t **info_ptr,
 			    int force)
 {
-	static job_info_msg_t *job_info_ptr = NULL, *new_job_ptr = NULL;
+	static job_info_msg_t *new_job_ptr = NULL;
 	uint16_t show_flags = 0;
 	int error_code = SLURM_NO_CHANGE_IN_DATA;
 	time_t now = time(NULL);
@@ -2622,9 +2622,9 @@ extern int get_new_info_job(job_info_msg_t **info_ptr,
 	static uint16_t last_flags = 0;
 
 	if(!force && ((now - last) < working_sview_config.refresh_delay)) {
-		if(*info_ptr != job_info_ptr)
+		if(*info_ptr != g_job_info_ptr)
 			error_code = SLURM_SUCCESS;
-		*info_ptr = job_info_ptr;
+		*info_ptr = g_job_info_ptr;
 		if(changed)
 			return SLURM_SUCCESS;
 		return error_code;
@@ -2633,17 +2633,17 @@ extern int get_new_info_job(job_info_msg_t **info_ptr,
 
 	if(working_sview_config.show_hidden)
 		show_flags |= SHOW_ALL;
-	if (job_info_ptr) {
+	if (g_job_info_ptr) {
 		if(show_flags != last_flags)
-			job_info_ptr->last_update = 0;
-		error_code = slurm_load_jobs(job_info_ptr->last_update,
+			g_job_info_ptr->last_update = 0;
+		error_code = slurm_load_jobs(g_job_info_ptr->last_update,
 					     &new_job_ptr, show_flags);
 		if (error_code == SLURM_SUCCESS) {
-			slurm_free_job_info_msg(job_info_ptr);
+			slurm_free_job_info_msg(g_job_info_ptr);
 			changed = 1;
 		} else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_NO_CHANGE_IN_DATA;
-			new_job_ptr = job_info_ptr;
+			new_job_ptr = g_job_info_ptr;
 			changed = 0;
 		}
 	} else {
@@ -2653,9 +2653,9 @@ extern int get_new_info_job(job_info_msg_t **info_ptr,
 	}
 
 	last_flags = show_flags;
-	job_info_ptr = new_job_ptr;
+	g_job_info_ptr = new_job_ptr;
 
-	if(*info_ptr != job_info_ptr)
+	if(*info_ptr != g_job_info_ptr)
 		error_code = SLURM_SUCCESS;
 
 	*info_ptr = new_job_ptr;
@@ -2915,6 +2915,14 @@ extern void get_info_job(GtkTable *table, display_data_t *display_data)
 	ListIterator itr = NULL;
 	GtkTreePath *path = NULL;
 
+	/* reset */
+	if(!table && !display_data) {
+		if(display_widget)
+			gtk_widget_destroy(display_widget);
+		display_widget = NULL;
+		return;
+	}
+
 	if(display_data)
 		local_display_data = display_data;
 	if(!table) {
diff --git a/src/sview/node_info.c b/src/sview/node_info.c
index f1e41540e3d..da1ad6e3073 100644
--- a/src/sview/node_info.c
+++ b/src/sview/node_info.c
@@ -583,7 +583,7 @@ update_color:
 
 extern int get_new_info_node(node_info_msg_t **info_ptr, int force)
 {
-	static node_info_msg_t *node_info_ptr = NULL, *new_node_ptr = NULL;
+	static node_info_msg_t *new_node_ptr = NULL;
 	uint16_t show_flags = 0;
 	int error_code = SLURM_NO_CHANGE_IN_DATA;
 	time_t now = time(NULL);
@@ -592,9 +592,9 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force)
 	static uint16_t last_flags = 0;
 
 	if(!force && ((now - last) < working_sview_config.refresh_delay)) {
-		if(*info_ptr != node_info_ptr)
+		if(*info_ptr != g_node_info_ptr)
 			error_code = SLURM_SUCCESS;
-		*info_ptr = node_info_ptr;
+		*info_ptr = g_node_info_ptr;
 		if(changed)
 			return SLURM_SUCCESS;
 
@@ -604,17 +604,17 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force)
 
 	if(working_sview_config.show_hidden)
 		show_flags |= SHOW_ALL;
-	if (node_info_ptr) {
+	if (g_node_info_ptr) {
 		if(show_flags != last_flags)
-			node_info_ptr->last_update = 0;
-		error_code = slurm_load_node(node_info_ptr->last_update,
+			g_node_info_ptr->last_update = 0;
+		error_code = slurm_load_node(g_node_info_ptr->last_update,
 					     &new_node_ptr, show_flags);
 		if (error_code == SLURM_SUCCESS) {
-			slurm_free_node_info_msg(node_info_ptr);
+			slurm_free_node_info_msg(g_node_info_ptr);
 			changed = 1;
 		} else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_NO_CHANGE_IN_DATA;
-			new_node_ptr = node_info_ptr;
+			new_node_ptr = g_node_info_ptr;
 			changed = 0;
 		}
 	} else {
@@ -624,9 +624,9 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force)
 	}
 
 	last_flags = show_flags;
-	node_info_ptr = new_node_ptr;
+	g_node_info_ptr = new_node_ptr;
 
-	if(*info_ptr != node_info_ptr)
+	if(*info_ptr != g_node_info_ptr)
 		error_code = SLURM_SUCCESS;
  	if(new_node_ptr && changed) {
 		int i;
@@ -638,8 +638,8 @@ extern int get_new_info_node(node_info_msg_t **info_ptr, int force)
 		cpus_per_node =
 			new_node_ptr->node_array[0].cpus / g_node_scaling;
 
-		for (i=0; i<node_info_ptr->record_count; i++) {
-			node_ptr = &(node_info_ptr->node_array[i]);
+		for (i=0; i<g_node_info_ptr->record_count; i++) {
+			node_ptr = &(g_node_info_ptr->node_array[i]);
 			if (!node_ptr->name || (node_ptr->name[0] == '\0'))
 				continue;	/* bad node */
 
@@ -1088,6 +1088,14 @@ extern void get_info_node(GtkTable *table, display_data_t *display_data)
 	sview_node_info_t *sview_node_info_ptr = NULL;
 	ListIterator itr = NULL;
 
+	/* reset */
+	if(!table && !display_data) {
+		if(display_widget)
+			gtk_widget_destroy(display_widget);
+		display_widget = NULL;
+		return;
+	}
+
 	if(display_data)
 		local_display_data = display_data;
 	if(!table) {
diff --git a/src/sview/part_info.c b/src/sview/part_info.c
index eb6988ed51e..bda57412169 100644
--- a/src/sview/part_info.c
+++ b/src/sview/part_info.c
@@ -1546,10 +1546,10 @@ static List _create_part_info_list(partition_info_msg_t *part_info_ptr,
 		return info_list;
 	}
 
-	if(info_list) {
-		list_destroy(info_list);
-	}
-	info_list = list_create(_part_info_list_del);
+	if(info_list)
+		list_flush(info_list);
+	else
+		info_list = list_create(_part_info_list_del);
 	if (!info_list) {
 		g_print("malloc error\n");
 		return NULL;
@@ -1679,7 +1679,6 @@ extern void refresh_part(GtkAction *action, gpointer user_data)
 
 extern int get_new_info_part(partition_info_msg_t **part_ptr, int force)
 {
-	static partition_info_msg_t *part_info_ptr = NULL;
 	static partition_info_msg_t *new_part_ptr = NULL;
 	uint16_t show_flags = 0;
 	int error_code = SLURM_NO_CHANGE_IN_DATA;
@@ -1689,9 +1688,9 @@ extern int get_new_info_part(partition_info_msg_t **part_ptr, int force)
 	static uint16_t last_flags = 0;
 
 	if(!force && ((now - last) < working_sview_config.refresh_delay)) {
-		if(*part_ptr != part_info_ptr)
+		if(*part_ptr != g_part_info_ptr)
 			error_code = SLURM_SUCCESS;
-		*part_ptr = part_info_ptr;
+		*part_ptr = g_part_info_ptr;
 		if(changed)
 			return SLURM_SUCCESS;
 		return error_code;
@@ -1701,17 +1700,17 @@ extern int get_new_info_part(partition_info_msg_t **part_ptr, int force)
 	if(working_sview_config.show_hidden)
 		show_flags |= SHOW_ALL;
 
-	if (part_info_ptr) {
+	if (g_part_info_ptr) {
 		if(show_flags != last_flags)
-			part_info_ptr->last_update = 0;
-		error_code = slurm_load_partitions(part_info_ptr->last_update,
+			g_part_info_ptr->last_update = 0;
+		error_code = slurm_load_partitions(g_part_info_ptr->last_update,
 						   &new_part_ptr, show_flags);
 		if (error_code == SLURM_SUCCESS) {
-			slurm_free_partition_info_msg(part_info_ptr);
+			slurm_free_partition_info_msg(g_part_info_ptr);
 			changed = 1;
 		} else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_NO_CHANGE_IN_DATA;
-			new_part_ptr = part_info_ptr;
+			new_part_ptr = g_part_info_ptr;
 				changed = 0;
 		}
 	} else {
@@ -1721,9 +1720,9 @@ extern int get_new_info_part(partition_info_msg_t **part_ptr, int force)
 	}
 
 	last_flags = show_flags;
-	part_info_ptr = new_part_ptr;
+	g_part_info_ptr = new_part_ptr;
 
-	if(*part_ptr != part_info_ptr)
+	if(*part_ptr != g_part_info_ptr)
 		error_code = SLURM_SUCCESS;
 
 	*part_ptr = new_part_ptr;
@@ -1961,6 +1960,14 @@ extern void get_info_part(GtkTable *table, display_data_t *display_data)
 	ListIterator itr = NULL;
 	GtkTreePath *path = NULL;
 
+	/* reset */
+	if(!table && !display_data) {
+		if(display_widget)
+			gtk_widget_destroy(display_widget);
+		display_widget = NULL;
+		return;
+	}
+
 	if(display_data)
 		local_display_data = display_data;
 	if(!table) {
diff --git a/src/sview/resv_info.c b/src/sview/resv_info.c
index e474c4fb9c5..6f4a63abe4c 100644
--- a/src/sview/resv_info.c
+++ b/src/sview/resv_info.c
@@ -81,8 +81,13 @@ static display_data_t display_data_resv[] = {
 	 refresh_resv, create_model_resv, admin_edit_resv},
 	{G_TYPE_STRING, SORTID_NODE_CNT,   "Node Count", TRUE, EDIT_TEXTBOX,
 	 refresh_resv, create_model_resv, admin_edit_resv},
-	{G_TYPE_STRING, SORTID_NODE_LIST,  "NodeList", TRUE, EDIT_TEXTBOX,
-	 refresh_resv, create_model_resv, admin_edit_resv},
+	{G_TYPE_STRING, SORTID_NODE_LIST,
+#ifdef HAVE_BG
+	 "BP List",
+#else
+	 "NodeList",
+#endif
+	 TRUE, EDIT_TEXTBOX, refresh_resv, create_model_resv, admin_edit_resv},
 	{G_TYPE_STRING, SORTID_TIME_START, "Time Start", TRUE, EDIT_TEXTBOX,
 	 refresh_resv, create_model_resv, admin_edit_resv},
 	{G_TYPE_STRING, SORTID_TIME_END,   "Time End", TRUE, EDIT_TEXTBOX,
@@ -119,6 +124,7 @@ static display_data_t options_data_resv[] = {
 	{G_TYPE_STRING, BLOCK_PAGE, "Blocks", TRUE, RESV_PAGE},
 	{G_TYPE_STRING, NODE_PAGE, "Base Partitions", TRUE, RESV_PAGE},
 #else
+	{G_TYPE_STRING, BLOCK_PAGE, NULL, TRUE, RESV_PAGE},
 	{G_TYPE_STRING, NODE_PAGE, "Nodes", TRUE, RESV_PAGE},
 #endif
 	{G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE}
@@ -786,30 +792,30 @@ extern void refresh_resv(GtkAction *action, gpointer user_data)
 extern int get_new_info_resv(reserve_info_msg_t **info_ptr,
 			     int force)
 {
-	static reserve_info_msg_t *resv_info_ptr = NULL, *new_resv_ptr = NULL;
+	static reserve_info_msg_t *new_resv_ptr = NULL;
 	int error_code = SLURM_NO_CHANGE_IN_DATA;
 	time_t now = time(NULL);
 	static time_t last;
 	static bool changed = 0;
 
 	if(!force && ((now - last) < working_sview_config.refresh_delay)) {
-		if(*info_ptr != resv_info_ptr)
+		if(*info_ptr != g_resv_info_ptr)
 			error_code = SLURM_SUCCESS;
-		*info_ptr = resv_info_ptr;
+		*info_ptr = g_resv_info_ptr;
 		if(changed)
 			return SLURM_SUCCESS;
 		return error_code;
 	}
 	last = now;
-	if (resv_info_ptr) {
-		error_code = slurm_load_reservations(resv_info_ptr->last_update,
-						     &new_resv_ptr);
+	if (g_resv_info_ptr) {
+		error_code = slurm_load_reservations(
+			g_resv_info_ptr->last_update, &new_resv_ptr);
 		if (error_code == SLURM_SUCCESS) {
-			slurm_free_reservation_info_msg(resv_info_ptr);
+			slurm_free_reservation_info_msg(g_resv_info_ptr);
 			changed = 1;
 		} else if (slurm_get_errno() == SLURM_NO_CHANGE_IN_DATA) {
 			error_code = SLURM_NO_CHANGE_IN_DATA;
-			new_resv_ptr = resv_info_ptr;
+			new_resv_ptr = g_resv_info_ptr;
 			changed = 0;
 		}
 	} else {
@@ -818,9 +824,9 @@ extern int get_new_info_resv(reserve_info_msg_t **info_ptr,
 		changed = 1;
 	}
 
-	resv_info_ptr = new_resv_ptr;
+	g_resv_info_ptr = new_resv_ptr;
 
-	if(*info_ptr != resv_info_ptr)
+	if(*info_ptr != g_resv_info_ptr)
 		error_code = SLURM_SUCCESS;
 
 	*info_ptr = new_resv_ptr;
@@ -945,6 +951,14 @@ extern void get_info_resv(GtkTable *table, display_data_t *display_data)
 	time_t now = time(NULL);
 	GtkTreePath *path = NULL;
 
+	/* reset */
+	if(!table && !display_data) {
+		if(display_widget)
+			gtk_widget_destroy(display_widget);
+		display_widget = NULL;
+		return;
+	}
+
 	if(display_data)
 		local_display_data = display_data;
 	if(!table) {
@@ -1263,14 +1277,13 @@ extern void popup_all_resv(GtkTreeModel *model, GtkTreeIter *iter, int id)
 		snprintf(title, 100, "Job(s) in reservation %s", name);
 		break;
 	case NODE_PAGE:
-#ifdef HAVE_BG
-		snprintf(title, 100,
-			 "Base partitions(s) in reservation %s",
-			 name);
-#else
-		snprintf(title, 100, "Node(s) in reservation %s ",
-			 name);
-#endif
+		if(cluster_flags & CLUSTER_FLAG_BG)
+			snprintf(title, 100,
+				 "Base partitions(s) in reservation %s",
+				 name);
+		else
+			snprintf(title, 100, "Node(s) in reservation %s ",
+				 name);
 		break;
 	case BLOCK_PAGE:
 		snprintf(title, 100, "Block(s) in reservation %s", name);
@@ -1459,3 +1472,55 @@ end_it:
 	return;
 }
 
+extern void cluster_change_resv()
+{
+	display_data_t *display_data = display_data_resv;
+	while(display_data++) {
+		if(display_data->id == -1)
+			break;
+		if(cluster_flags & CLUSTER_FLAG_BG) {
+			switch(display_data->id) {
+			case SORTID_NODE_LIST:
+				display_data->name = "BP List";
+				break;
+			default:
+				break;
+			}
+		} else {
+			switch(display_data->id) {
+			case SORTID_NODE_LIST:
+				display_data->name = "NodeList";
+				break;
+			default:
+				break;
+			}
+		}
+	}
+	display_data = options_data_resv;
+	while(display_data++) {
+		if(display_data->id == -1)
+			break;
+
+		if(cluster_flags & CLUSTER_FLAG_BG) {
+			switch(display_data->id) {
+			case BLOCK_PAGE:
+				display_data->name = "Blocks";
+				break;
+			case NODE_PAGE:
+				display_data->name = "Base Partitions";
+				break;
+			}
+		} else {
+			switch(display_data->id) {
+			case BLOCK_PAGE:
+				display_data->name = NULL;
+				break;
+			case NODE_PAGE:
+				display_data->name = "Nodes";
+				break;
+			}
+		}
+	}
+	get_info_resv(NULL, NULL);
+}
+
diff --git a/src/sview/sview.c b/src/sview/sview.c
index 453142bf17f..5fbf76ca40f 100644
--- a/src/sview/sview.c
+++ b/src/sview/sview.c
@@ -74,6 +74,13 @@ GCond *grid_cond = NULL;
 uint32_t cluster_flags;
 int cluster_dims;
 
+block_info_msg_t *g_block_info_ptr = NULL;
+job_info_msg_t *g_job_info_ptr = NULL;
+node_info_msg_t *g_node_info_ptr = NULL;
+partition_info_msg_t *g_part_info_ptr = NULL;
+reserve_info_msg_t *g_resv_info_ptr = NULL;
+slurm_ctl_conf_info_msg_t *g_ctl_info_ptr = NULL;
+
 static GtkActionGroup *admin_action_group = NULL;
 static GtkActionGroup *menu_action_group = NULL;
 static bool debug_inited = 0;
@@ -807,7 +814,34 @@ extern void change_cluster_main()
 			}
 		}
 	}
+	slurm_free_block_info_msg(g_block_info_ptr);
+	g_block_info_ptr = NULL;
+	slurm_free_job_info_msg(g_job_info_ptr);
+	g_job_info_ptr = NULL;
+	slurm_free_node_info_msg(g_node_info_ptr);
+	g_node_info_ptr = NULL;
+	slurm_free_partition_info_msg(g_part_info_ptr);
+	g_part_info_ptr = NULL;
+	slurm_free_reservation_info_msg(g_resv_info_ptr);
+	g_resv_info_ptr = NULL;
+	slurm_free_ctl_conf(g_ctl_info_ptr);
+	g_ctl_info_ptr = NULL;
+
+	/* if(g_block_info_ptr) */
+	/* 	g_block_info_ptr->last_update = 0; */
+	/* if(g_job_info_ptr) */
+	/* 	g_job_info_ptr->last_update = 0; */
+	/* if(g_node_info_ptr) */
+	/* 	g_node_info_ptr->last_update = 0; */
+	/* if(g_part_info_ptr) */
+	/* 	g_part_info_ptr->last_update = 0; */
+	/* if(g_resv_info_ptr) */
+	/* 	g_resv_info_ptr->last_update = 0; */
+	/* if(g_ctl_info_ptr) */
+	/* 	g_ctl_info_ptr->last_update = 0; */
+
 	cluster_change_block();
+	cluster_change_resv();
 }
 
 extern void refresh_main(GtkAction *action, gpointer user_data)
diff --git a/src/sview/sview.h b/src/sview/sview.h
index b4edc9bb56a..b579a22fa1d 100644
--- a/src/sview/sview.h
+++ b/src/sview/sview.h
@@ -265,7 +265,6 @@ typedef struct {
 	List *button_list;
 } signal_params_t;
 
-
 extern sview_config_t default_sview_config;
 extern sview_config_t working_sview_config;
 
@@ -294,6 +293,13 @@ extern int sview_colors_cnt;
 extern uint32_t cluster_flags;
 extern int cluster_dims;
 
+extern block_info_msg_t *g_block_info_ptr;
+extern job_info_msg_t *g_job_info_ptr;
+extern node_info_msg_t *g_node_info_ptr;
+extern partition_info_msg_t *g_part_info_ptr;
+extern reserve_info_msg_t *g_resv_info_ptr;
+extern slurm_ctl_conf_info_msg_t *g_ctl_info_ptr;
+
 extern void init_grid(node_info_msg_t *node_info_ptr);
 extern int set_grid(int start, int end, int count);
 extern int set_grid_bg(int *start, int *end, int count, int set);
-- 
GitLab