@@ -376,6 +376,7 @@ ib_api_status_t osm_prtn_make_partitions(osm_log_t * p_log, osm_subn_t * p_subn)
struct stat statbuf;
const char *file_name;
boolean_t is_config = TRUE;
+ boolean_t is_wrong_config = FALSE;
ib_api_status_t status = IB_SUCCESS;
cl_map_item_t *p_next;
osm_prtn_t *p;
@@ -389,6 +390,7 @@ ib_api_status_t osm_prtn_make_partitions(osm_log_t * p_log, osm_subn_t * p_subn)
is_config = FALSE;
}
+retry_default:
/* clean up current port maps */
p_next = cl_qmap_head(&p_subn->prtn_pkey_tbl);
while (p_next != cl_qmap_end(&p_subn->prtn_pkey_tbl)) {
@@ -404,9 +406,11 @@ ib_api_status_t osm_prtn_make_partitions(osm_log_t * p_log, osm_subn_t * p_subn)
if (status != IB_SUCCESS)
goto _err;
- if (is_config && osm_prtn_config_parse_file(p_log, p_subn, file_name))
+ if (is_config && osm_prtn_config_parse_file(p_log, p_subn, file_name)) {
OSM_LOG(p_log, OSM_LOG_VERBOSE, "Partition configuration "
"was not fully processed\n");
+ is_wrong_config = TRUE;
+ }
/* and now clean up empty partitions */
p_next = cl_qmap_head(&p_subn->prtn_pkey_tbl);
@@ -421,6 +425,13 @@ ib_api_status_t osm_prtn_make_partitions(osm_log_t * p_log, osm_subn_t * p_subn)
}
}
+ if (is_config && is_wrong_config) {
+ OSM_LOG(p_log, OSM_LOG_ERROR, "Partition configuration "
+ "in error; retrying with default config\n");
+ is_config = FALSE;
+ goto retry_default;
+ }
+
_err:
return status;
}
@@ -696,6 +696,9 @@ done:
return len;
}
+/**
+ * @return -1 on error, 0 on success
+ */
int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
const char *file_name)
{
@@ -703,6 +706,7 @@ int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
struct part_conf *conf = NULL;
FILE *file;
int lineno;
+ boolean_t is_parse_success;
file = fopen(file_name, "r");
if (!file) {
@@ -714,6 +718,8 @@ int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
lineno = 0;
+ is_parse_success = FALSE;
+
while (fgets(line, sizeof(line) - 1, file) != NULL) {
char *q, *p = line;
@@ -724,6 +730,8 @@ int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
q = strchr(p, '#');
if (q)
*q = '\0';
+ else
+ is_parse_success = TRUE;
do {
int len;
@@ -741,6 +749,7 @@ int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
"PARSE ERROR: line %d: "
"internal: cannot create config\n",
lineno);
+ is_parse_success = FALSE;
break;
}
@@ -750,6 +759,7 @@ int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
len = parse_part_conf(conf, p, lineno);
if (len < 0) {
+ is_parse_success = FALSE;
break;
}
@@ -764,5 +774,8 @@ int osm_prtn_config_parse_file(osm_log_t * p_log, osm_subn_t * p_subn,
fclose(file);
- return 0;
+ if (is_parse_success)
+ return 0;
+ else
+ return -1;
}