int lustre_get_jobid(char *jobid)
{
int jobid_len = LUSTRE_JOBID_SIZE;
+ char tmp_jobid[LUSTRE_JOBID_SIZE] = { 0 };
int rc = 0;
ENTRY;
- memset(jobid, 0, LUSTRE_JOBID_SIZE);
/* Jobstats isn't enabled */
if (strcmp(obd_jobid_var, JOBSTATS_DISABLE) == 0)
- RETURN(0);
+ GOTO(out, rc = 0);
/* Whole node dedicated to single job */
if (strcmp(obd_jobid_var, JOBSTATS_NODELOCAL) == 0) {
- memcpy(jobid, obd_jobid_node, LUSTRE_JOBID_SIZE);
- RETURN(0);
+ memcpy(tmp_jobid, obd_jobid_node, LUSTRE_JOBID_SIZE);
+ GOTO(out, rc = 0);
}
/* Use process name + fsuid as jobid */
if (strcmp(obd_jobid_var, JOBSTATS_PROCNAME_UID) == 0) {
- snprintf(jobid, LUSTRE_JOBID_SIZE, "%s.%u",
+ snprintf(tmp_jobid, LUSTRE_JOBID_SIZE, "%s.%u",
current_comm(),
from_kuid(&init_user_ns, current_fsuid()));
- RETURN(0);
+ GOTO(out, rc = 0);
}
- rc = cfs_get_environ(obd_jobid_var, jobid, &jobid_len);
+ rc = cfs_get_environ(obd_jobid_var, tmp_jobid, &jobid_len);
if (rc) {
if (rc == -EOVERFLOW) {
/* For the PBS_JOBID and LOADL_STEP_ID keys (which are
obd_jobid_var, rc);
}
}
- RETURN(rc);
+
+out:
+ if (rc != 0)
+ RETURN(rc);
+
+ /* Only replace the job ID if it changed. */
+ if (strcmp(jobid, tmp_jobid) != 0)
+ memcpy(jobid, tmp_jobid, jobid_len);
+
+ RETURN(0);
}
EXPORT_SYMBOL(lustre_get_jobid);